2011年11月6日星期日

百练2974 字符串处理与映射



开始想用map映射,但只有一对一,没有多对一,囧~
这么算的话还是if的要快点。。。
但是没想到标程的自建map映射这么奇葩,就用一个数组 = =!!
效率是确实要比我的高啊。。。

#include
#include
#include
#include
using namespace std;
string num[100001];
int main()
{
int n;
char t[80];     //喵的这个开小的,然后RE  = =
scanf("%d",&n);
for(int i = 0;i < n;i ++){
scanf("%s",t);
for(int k = 0;k < strlen(t);k ++){
if(t[k] == '-')continue;
if(t[k] >= '0' && t[k] <= '9')num[i]+=t[k];
if(t[k] >= 'A' && t[k] <= 'C')num[i]+='2';
if(t[k] >= 'D' && t[k] <= 'F')num[i]+='3';
if(t[k] >= 'G' && t[k] <= 'I')num[i]+='4';
if(t[k] >= 'J' && t[k] <= 'L')num[i]+='5';
if(t[k] >= 'M' && t[k] <= 'O')num[i]+='6';
if(t[k] >= 'P' && t[k] <= 'S')num[i]+='7';
if(t[k] >= 'T' && t[k] <= 'V')num[i]+='8';
if(t[k] >= 'W' && t[k] <= 'Y')num[i]+='9';
}
}
sort(&num[0],&num[0] + n);
int tmp = 0,flag = 0;
for(int i = 0;i < n;i ++){
if(num[i] == num[i+1])tmp ++;
else if(tmp){
printf("%s-%s %d\n",num[i].substr(0,3).data(),num[i].substr(3).data(),tmp + 1);   //返回子串(string),转成char[]
flag = 1;   //标记已输出
tmp = 0;
}
}
if(!flag)printf("No duplicates.\n");
return 0;
}
//5796kB 710ms


//附标程:1948kB 410ms
/*

2011年11月5日星期六

POJ 1484 Blowing Fuses


#include
int main()
{
int n,m,c,i,count = 1;
while(scanf("%d%d%d",&n,&m,&c) &&  n){
int dev[21]={0},flag[21]={0},max = 0,sum = 0;
for(i = 1;i <= n;i ++)
scanf("%d",&dev[i]);
while(m --){
scanf("%d",&i);
if(!flag[i]){
flag[i] = 1;
sum += dev[i];
}
else {flag[i] = 0;sum -= dev[i];}
if(sum > max)max = sum;
}
printf("Sequence %d\n",count);
if(max > c)printf("Fuse was blown.\n\n");
else printf("Fuse was not blown.\nMaximal power consumption was %d amperes.\n\n",max);
count ++;
}
return 0;
}



思路清晰,简单明了。模拟水题。。。。。
开一个判断数组,关了的就开,然后累计负载;开了的就关,释放负载,过程中记录最大值。

2011年11月4日星期五

POJ 1477 Box of Bricks


水到让人情何以堪、、、、、、囧~~~~~

#include
int main()
{
int n,count = 1;
while(scanf("%d",&n) && n){
int a[51]={0},sum = 0,mov = 0;
for(int i = 0;i < n;i ++){
scanf("%d",&a[i]);
sum += a[i];
}
for(int i = 0;i < n;i ++)
if(a[i] > sum / n)mov += a[i] - sum / n;
printf("Set #%d\nThe minimum number of moves is %d.\n\n",count,mov);
count ++;
}
return 0;
}