ZZUOJ-1194-ARM立即数寻址 (郑州大学第七届ACM大学生程序设计竞赛正式赛F题)

Problem F: ARM立即数寻址

Time Limit: 4 Sec  Memory Limit: 128 MB

Submit: 53  Solved: 12

[Submit][Status][Web
Board
]

Description

在ARM处理器立即数寻址方式中,立即数是由一个8位的无符号常数(大于等于0,小于等于0xff),先扩展为32位,然后循环右移偶数位得到。所以类似0x101,0x102,0xFF1,0xFF04,0x8000007F等都是无效的立即数,而像0xFF,0x3FC,0xC000003F,0x104,0xFF0,0xFF00,0xf000000f等都是有效的立即数。

现在给你一个32位的正整数,请你判断这个数是否是有效的立即数。

(0x12345678循环右移4位变为0x81234567。)

Input

一个正整数T (T<= 1000000),表示有T组测试数据

每一组测试数据包含一个32位的十六进制数n (0<= n <= 0xffffffff)

Output

共T行。对于每个n,输出占一行,如果n是有效的立即数输出"YES",否则输出"NO"。

Sample Input

30xff0xFF0xF0F

Sample Output

YESYESNO

HINT

比赛时原题有错误,“大于0”应为“大于等于0”。

刚开始的做法让我做了好久.......

题意:给一个16进制数,如果这个数的32位形式按往左循环偶数位可以变成一个8位二进制数就输出YES,否则输出NO

例如:0x3FC可转化为0000 0000 0000 0000 0000 0011 1111 1100 再往左循环30位偶数位变为0000 0000 0000 0000 0000 0000 1111 1111,符合条件!!输出YES!

思路:先转化为32位,然后往左循环偶数位再看他是不是一个8位二进制数

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

char a[12];
int b[80];

void writeb(int n, int a)
{
	for(int i=4*n; i>4*(n-1); i--)
	{
		b[i] = a%2;
		a/=2;
	}
}

int fun(char ch)
{
	if(ch>='0' && ch<='9') return (int)ch;
	else if(ch>='a' && ch<='f') return (int)ch-87;
	else if(ch>='A' && ch<='F') return (int)ch-55;
}

int judge(int i, int j)
{
	while(!b[i])i++;
	return j-i+1;
}

int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		scanf("%s", a);
		memset(b, 0, sizeof(b));
		int num=8;
		for(int i=strlen(a)-1; a[i]!='x'; i--)
		{
			writeb(num, fun(a[i]));
			num--;
		}
		int min = judge(1,32);
		for(int i=2; i<=30; i+=2)
		{
			int j;
			for(j=1; j<=i; j++)
			{
				b[32+j] = b[j];
			}
			if(judge(1+i, 32+i)<min)min=judge(1+i, 32+i);
		}
		if(min<=8)printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

之前做了1个多小时的逗比做法,今天我怎么了......

逗比了的代码(做着做着我整个人都不好了,贴下当个教训...):

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

char a[12], b[45];

int fun1(char ch)
{
	if(ch>'0' && ch<='1') return 1;
	else if(ch>='2' && ch<='3') return 2;
	else if(ch>='4' && ch<='7') return 3;
	else return 4;
}

int fun2(char ch)
{
	int num, de=4;
	if(ch>'0' && ch<='9') num = ch-'0';
	else if(ch>='a' && ch<='f') num = ch-'0'-87;
	else if(ch>='A' && ch<='F') num = ch-'0'-55;
	while(num)
	{
		if(num%2==1) return de;
		else
		{
			num/=2;
			de--;
		}
	}
}

int judge1(char a[])
{
	int count = 0;
	for(int i=2; a[i]!='\0'; i++)
	{
		if(a[i]!='0')count++;
	}
	return count;
}

int judge2(char a[])
{
	int len = strlen(a);
	for(int i=2; i<len-1; i++)
	{
		if(a[i]!='0'&&a[i+1]!='0')return 1;
	}
	if(a[2]!='0' && a[len-1]!='0' && len==10)return 1;
	for(int i=2; i<len-2; i++)
	{
		if(fun1(a[i]) + fun2(a[i+2]) <=4)return 1;
	}
	if(len==10&&a[2]!='0' && a[len-2]!='0'&&fun1(a[2])+fun2(a[len-2])<=4)return 1;
	if(len==10&&a[3]!='0'&&a[len-1]!='0'&&fun1(a[len-1])+fun2(a[3])<=4)return 1;
	return 0;
}

int judge3(char a[])
{
	int len = strlen(a);
	for(int i=2; i<len-2; i++)
	{
		if(a[i]!='0'&&a[i+1]!='0'&&a[i+2]!='0')return i;
	}
	if(a[2]!='0'&&a[3]!='0'&&a[len-1]!='0'&&len==10)return -1;
	if(a[2]!='0'&&a[len-2]!='0'&&a[len-1]!='0'&&len==10)return -2;
	return 0;
}

int judge4(char a[], int i)
{
	int len = strlen(a);
	if(i>0 && (fun1(a[i])+fun2(a[i+2])<=4))return 1;
	else if(i==-1 && (fun1(a[len-1])+fun2(a[3])<=4)) return 1;
	else if(i==-2 && (fun1(a[len-2])+fun2(a[2])<=4)) return 1;
	else return 0;
}

int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		scanf("%s", a);
		if(judge1(a)>3)
		{
			printf("NO\n"); continue;
		}
		if(judge1(a)<=1)
		{
			printf("YES\n"); continue;
		}
		if(judge1(a)==2)
		{
			if(judge2(a))
			{
				printf("YES\n"); continue;
			}
			else
			{
				printf("NO\n"); continue;
			}
		}
		int xia;
		if(judge1(a) == 3)
		{
			if(xia = judge3(a))
			{
				if(judge4(a, xia)){ printf("YES\n"); continue;}
				else { printf("NO\n"); continue;}
			}
			else
			{
				printf("NO\n"); continue;
			}
		}
	}
	return 0;
} 
时间: 2024-10-11 03:29:04

ZZUOJ-1194-ARM立即数寻址 (郑州大学第七届ACM大学生程序设计竞赛正式赛F题)的相关文章

ZZUOJ - 1245 - 寻找幸福的小L ( 郑州大学第八届ACM大学生程序设计竞赛正式赛F题)

1245: 寻找幸福的小L Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 60  Solved: 14 [Submit][Status][Web Board] Description 小L最近看上了一个女同学叫小A,但是小A是个高冷的姑娘,所以她给小L出了个难题,她给小L留下了一张纸条,上面只有一个坐标,和一个时间,所以小L需要在规定时间找到这个坐标的地点,并在那个时间到哪个地点等待小A,但是很无奈,小L不是一个地理通,所以他找到了小A的室友,想

ZZUOJ-1195-(郑州大学第七届ACM大学生程序设计竞赛E题)

1195: OS Job Scheduling Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 106  Solved: 35 [Submit][Status][Web Board] Description OS(Operating System) is to help user solve the problem, such as run job(task).A multitasking OS is one that can simultaneo

ZZUOJ-1195-OS Job Scheduling(郑州大学第七届ACM大学生程序设计竞赛E题)

1195: OS Job Scheduling Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 106  Solved: 35 [Submit][Status][Web Board] Description OS(Operating System) is to help user solve the problem, such as run job(task).A multitasking OS is one that can simultaneo

(最短路)第七届福建省大学生程序设计竞赛 Problem J- X

Problem Description X is a fully prosperous country, especially known for its complicated transportation networks. But recently, for the sake of better controlling by the government, the president Fat Brother thinks it's time to close some roads in o

[家里蹲大学数学杂志]第435期第七届中国大学生数学竞赛预赛试题(数学类,2015年10月)参考解答

一. ($15'$) 设 $L_1$ 和 $L_2$ 是空间中两异面直线. 设在标准直角坐标系下直线 $L_1$ 过坐标为 $a$ 的点, 以单位向量 $v$ 为直线方向; 直线 $L_2$ 过坐标为 $b$ 的点, 以单位向量 $w$ 为直线方向.   (1). 证明: 存在唯一点 $P\in L_1$ 和 $Q\in L_2$ 使得两点连线 $PQ$ 同时垂直于 $L_1$ 和 $L_2$.   (2). 求 $P$ 点和 $Q$ 点坐标 (用 $a,b,v,w$ 表示). 证明: 由题意,

2015 年第七届全国大学生数学竞赛江西赛区获奖名单(数学专业)

姓名 性别 赛区 学校名称 所学专业 参赛类型 获奖等级 廖登传 男 江西省 东华理工大学 数学与应用数学 数学专业 一等奖 马士飞 男 江西省 东华理工大学 数学与应用数学 数学专业 一等奖 聂鹏 男 江西省 东华理工大学 数学与应用数学 数学专业 二等奖 胡海浩 男 江西省 东华理工大学 数学与应用数学 数学专业 二等奖 王琪 男 江西省 东华理工大学 数学与应用数学 数学专业 二等奖 张雷 男 江西省 东华理工大学 信息与计算科学 数学专业 二等奖 饶小花 女 江西省 东华理工大学 数学与

“亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (部分题解)

“亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 F 自动售货机 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 60            测试通过 : 13  题目描述 教学楼有一台奇怪的自动售货机,它只售卖一种饮料,单价5元,并且只收5元.10元面值的货币,但是同学们都很喜欢喝.这个售货机里没有多余的找零,也就是说如果一个持有10元的同学第一个购买,则他不能获得5元找零,但是如果在他之前有一个持有5

2016 年宁波工程学院第七届ACM校赛题解报告

2016 年宁波工程学院第七届ACM校赛题解报告 本题解代码直接为比赛代码,仅供参考. A,B,C,D,G,H,J,K,L,M 来自 Ticsmtc 同学. F 来自 Gealo 同学. E,I 来自Alex 学长. Promblem A :    Two Sum 时间限制: 1 Sec  内存限制: 64 MB 题目描述: 给出n个数,另外给出?个整数S,判断是否可以从中取出2个数,使得这两个数的和是S. 输入: 第?行有个整数T(1 <= T <= 10),代表数据组数. 对于每组数据,第

河南省第七届ACM程序设计大赛赛后总结

我们学校ACM集训开始于4月5号(清明节),5月25日在郑州解放军信息工程大学举办,集训耗时50天,但是感觉效果还行,但是也不是太好:我们也已经尽力了,虽然说只拿了个银牌,每份收获的背后,都会有辛勤的汗水,毕竟我们也努力了: 下面说说比赛中的问题:觉得吧,虽说模拟赛参加了很多,但是到了正式的比赛的时候,还是出现了紧张的情况,九点开始比赛,我们AC第一道题的时间是在十点半左右,题目不难而且曾经也做过啊,但是就是调试不好,越调试不好,心里就越急啊:刚开始看题的时间,我们都看了第一道题,意思也都明白,