SDUT 2012春季ACM内部测试赛4's

 A:http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2216

polla队长很快就做出来了。本以为是水题,可是今天看了看,也不是那么水。orz之。。自己刚开始把题意给理解错了,以为只有IXCM可以重复出现,其他只能出现一次,而且IXC只能出现三次。愚蠢啊。。。题意是给你罗马数字然后你求和后再输出罗马数字,rule里面的第二条我给理解错了。其实就是说明出现减式时只能是连续的两个其组合是

I (X,C)    X(L,C)   C(D,M)其实根据后一个不能大于前一个的10被就能推出这个组合。。。然后 IX = 4 IC = 9 XL = 40 XC = 90 CD = 400 CM =900 

先推出每个数,然后求和,组后由大到小输出。。

View Code

C:http://acm.sdut.edu.cn/web/showproblem.php?pid=2218&cid=1095

膜拜polla。。。。弄清思路,几分钟就1Y了。。。。佩服啊。。。orz

找规律:0-100就有二十个数满足分别是0,2,4,6,30,32,34,36,40,42,44,46,50,52,54,56,60,62,64,66

将n转化成20进制数处理,需要注意septillion,sextillion含有E,在对20取余的时候直接把它们略过去了,但遇到6是说明7已经有了所以7与6之间的数都为,000,000。

View Code
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int num[20] = {0,2,4,6,30,32,34,36,40,42,44,46,50,52,54,56,60,62,64,66};
int a[15];
int main()
{
int i,j,n;
while (cin>>n)
{
if (!n) break;
i = 0;
while (n)
{
a[i++] = num[n%20];
n /= 20;
}
printf("%d",a[i - 1]);
for (j = i - 2; j >= 0; --j)
{
if (j == 6) printf(",000,000");
printf(",%.3d",a[j]);
}
printf("\n");
}
return 0;
}

 

G:http://acm.sdut.edu.cn/web/showproblem.php?pid=2222&cid=1095

看了很长时间才看懂,就是给你一套密码,然后你将它翻译。

密码是这样来的:首先应为字母A-Z对应 01--26空格对应27

每三个字符(包括空格,最后字符不足用空个补齐注意这里是你多补进去的,最后输出的时候要处理掉就是因为这里pe了一次)组成一个六位密码,然后每组密码除以对应的关键字取余最后组成题目中给出的密码序列。。。感觉就是一个模拟过程。。

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 55
using namespace std;
char ar[maxn][10],str[maxn][10];
int ans[maxn];
int main()
{
int a,b,c,d;
int ma,mb,mc,md;
int t,i,j,n;
cin>>t;
while (t--)
{
cin>>n;
cin>>ma>>mb>>mc>>md;
for (i = 0; i < n; ++i)
{
cin>>ar[i];
//首先把余数对应的取出来
int len = strlen(ar[i]) - 1;
a = b = c =d = 0;
if (len - 1 >= 0) a = a*10 + ar[i][len -1] - '0';
if (len >= 0) a = a*10 + ar[i][len] - '0';
len -= 2;
if (len - 1 >= 0) b = b*10 + ar[i][len - 1] - '0';
if (len >= 0) b = b*10 + ar[i][len] - '0';
len -= 2;
if (len - 1 >= 0) c = c*10 + ar[i][len - 1] - '0';
if (len >= 0) c = c*10 + ar[i][len] - '0';
len -= 2;
if (len - 1 >= 0) d = d*10 + ar[i][len - 1] - '0';
if (len >= 0) d = d*10 + ar[i][len] - '0';
len -= 2;
for (j = 1; j <= 272727; ++j)//循环查找中间密码
{
if (j%ma == d && j%mb == c && j%mc == b && j%md == a)
{
ans[i] = j;
break;
}
}
}
int tmp[5];
for (i = 0; i < n - 1; ++i)//取出对应的数字转化的字符
{
int p = ans[i];
memset(tmp,0,sizeof(tmp));
if (p/10 != 0)
{
tmp[0] = tmp[0]*10 + p%100;
p /= 100;
}
else if (p)
{
tmp[0] = tmp[0]*10 + p%10;
p/= 10;
}
if (p/10 != 0)
{
tmp[1] = tmp[1]*10 + p%100;
p /= 100;
}
else if (p)
{
tmp[1] = tmp[1]*10 + p%10;
p /= 10;
}
if (p/10 != 0)
{
tmp[2] = tmp[2]*10 + p%100;
p /= 100;
}
else if (p)
{
tmp[2] = tmp[2]*10 + p%10;
p /= 10;
}
for (j = 2; j >= 0; --j)
{
if (tmp[j] == 27) printf(" ");
else printf("%c",tmp[j] + 'A' - 1);
}
}
//单独处理最后一组数据,应该可能多加了空格
int p = ans[n - 1];
memset(tmp,0,sizeof(tmp));
if (p/10 != 0)
{
tmp[0] = tmp[0]*10 + p%100;
p /= 100;
}
else if (p)
{
tmp[0] = tmp[0]*10 + p%10;
p/= 10;
}
if (p/10 != 0)
{
tmp[1] = tmp[1]*10 + p%100;
p /= 100;
}
else if (p)
{
tmp[1] = tmp[1]*10 + p%10;
p /= 10;
}
if (p/10 != 0)
{
tmp[2] = tmp[2]*10 + p%100;
p /= 100;
}
else if (p)
{
tmp[2] = tmp[2]*10 + p%10;
p /= 10;
}
//处理空格
int l = 0;
for (j = 0; j < 3; ++j)
{
if (tmp[j] != 27)
{
l = j; break;
}
}
for (i = 2; i >= j; --i)
{
if (tmp[i] == 27) printf(" ");
else printf("%c",tmp[i] + 'A' -1);
}
printf("\n");
}
return 0;
}

 

posted @ 2012-03-17 19:20  E_star  阅读(374)  评论(0编辑  收藏  举报