分享

5.8

 玉诗 2014-05-08

2976:All in All

总时间限制:
1000ms
内存限制:
65536kB
描述
给定两个字符串s和t,请判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。
输入
包括若干个测试数据。每个测试数据由两个ASCII码的数字和字母串s和t组成,s和t的长度不超过100000。
输出
对每个测试数据,如果s是t的子序列则输出“Yes”,否则输出“No”。
样例输入
sequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter
样例输出
Yes
No
Yes
No
#include<stdio.h>
#include<string.h>
int main()
{char s[100100],t[100100];
int k,i,j,m,n;
while(scanf("%s",s)!=EOF && scanf("%s",t)!=EOF) 
{
m=strlen(s);
n=strlen(t);
for(i=0,j=0;i<=m-1,j<=n-1;j++)
{if(s[i]==t[j]) {
i++;
}
}

if(i==m)
printf("Yes\n");
else
printf("No\n");}
return 0;
}

2974:487-3279

总时间限制:
1000ms
内存限制:
65536kB
描述
企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GINO来向Gino's订一份pizza。让电话号码容易被记住的另一个办法是以一种好记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码3-10-10-10,你可以从他们那里订pizza。

电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下:
A, B, 和C 映射到 2
D, E, 和F 映射到 3
G, H, 和I 映射到 4
J, K, 和L 映射到 5
M, N, 和O 映射到 6
P, R, 和S 映射到 7
T, U, 和V 映射到 8
W, X, 和Y 映射到 9

Q和Z没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。 TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。

如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)

你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。
输入
输入的格式是,第一行是一个正整数,指定电话号码薄中号码的数量(最多100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。
输出
对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行:
No duplicates.
样例输入
12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279
样例输出
310-1010 2
487-3279 4
888-4567 3
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char map[]="22233344455566677778889999";
char str[80],t[100000][9];
int compare(const void*elem1,const void*elem2){
	return(strcmp((char*)elem1,(char*)elem2));
};
int s(int n){
	int j,k;
	j=k=-1;
	while(k<8){
	j++;
	if(str[j]=='-')continue;
	k++;
	if(k==3){
	t[n][k]='-';
	k++;}
	if(str[j]>='A'&&str[j]<='Z'){
	t[n][k]=map[str[j]-'A'];
	continue;};
	t[n][k]=str[j];
}
	t[n][k]='\0';
	return 0;}
int main(){
int n,i,j;
bool noduplicate;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s",str);
s(i);}
qsort(t,n,9,compare);
noduplicate=true;
i=0;while(i<n){
	j=i;i++;
	while(i<n&&strcmp(t[i],t[j])==0)i++;
	if(i-j>1){
	printf("%s %d\n",t[j],i-j);
	noduplicate=false;}
}
if(noduplicate)printf("No duplicates.\n");
return 0;}

2973:Skew数

总时间限制:
1000ms
内存限制:
65536kB
描述
在 skew binary表示中, 第 k 位的值xk表示xk*(2k+1-1)。 每个位上的可能数字是0 或 1,最后面一个非零位可以是2, 例如, 10120(skew) = 1*(25-1) + 0*(24-1) + 1*(23-1) + 2*(22-1) + 0*(21-1) = 31 + 0 + 7 + 6 + 0 = 44. 前十个skew数是 0、1、2、10、11、12、20、100、101、以及102。
输入
输入包含一行或多行,每行包含一个整数n。 如果 n = 0 表示输入结束,否则n是一个skew 数
输出
对于每一个输入,输出它的十进制表示。转换成十进制后, n 不超过 231-1 = 2147483647
样例输入
10120
200000000000000000000000000000
10
1000000000000000000000000000000
11
100
11111000001110000101101102000
0
样例输出
44
2147483646
3
2147483647
4
7
1041110737
#include<stdio.h>
#include<string.h>
int main()
{int i,k,base[31],sum;
char skew[32];
base[0]=1;
for(i=1;i<31;i++)
base[i]=2*base[i-1]+1;
while(1)
{scanf("%s",skew);
if(strcmp(skew,"0")==0)
break;
sum=0;
k=strlen(skew);
for(i=0;i<strlen(skew);i++)
{k--;
sum+=(skew[i]-'0')*base[k];
}
printf("%d\n",sum);
}
return 0;
}

2972:确定进制

总时间限制:
1000ms
内存限制:
65536kB
描述
6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13) = 42(13), 而 42(13) = 4 * 131 + 2 * 130 = 54(10)。 你的任务是写一段程序读入三个整数p、q和 r,然后确定一个进制 B(2<=B<=16) 使得 p * q = r. 如果 B有很多选择, 输出最小的一个。例如: p = 11, q = 11, r = 121. 则有 11(3) * 11(3) = 121(3) 因为 11(3) = 1 * 31 + 1 * 30 = 4(10) 和 121(3) = 1 * 32 + 2 * 31 + 1 * 30 = 16(10)。 对于进制 10,有 11(10) * 11(10) = 121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。
输入
输入有 T组测试样例。 T在第一行给出。每一组测试样例占一行,包含三个整数p、q、r。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。
输出
对于每个测试样例输出一行。该行包含一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。
样例输入
3
6 9 42
11 11 121
2 2 2
样例输出
13
3
0
#include<stdio.h>
#include<string.h>
long b2ten(char*x,int b){
	int ret=0,i;
	int len=strlen(x);
	for(i=0;i<len;i++){
		if(x[i]-'0'>=b)return -1;
		ret*=b;
		ret+=x[i]-'0';
	}
	return (long)ret;
}
int main(){
	int n,b;
	char p[8],q[8],r[8];
	long pa,qa,ra;
	scanf("%d",&n);
	while(n--){
	scanf("%s%s%s",q,p,r);
	for(b=2;b<=16;b++){
		pa=b2ten(p,b);
		qa=b2ten(q,b);
		ra=b2ten(r,b);
		if(pa==-1||qa==-1||ra==-1)continue;
		if(pa*qa==ra){
		printf("%d\n",b);
		break;}
	}
	if(b==17)printf("0\n");
	}
return 0;}

2966:时区转换

总时间限制:
1000ms
内存限制:
65536kB
描述
直到19世纪,时间校准是一个纯粹的地方现象。每一个村庄当太阳升到最高点的时候把他们的时钟调到中午12点。一个钟表制造商人家或者村里主表的时间被认为是官方时间,市民们把自家的钟表和这个时间对齐。每周一些热心的市民会带着时间标准的表,游走大街小巷为其他市民对表。在城市之间旅游的话,在到达新地方的时候需要把怀表校准。但是,当铁路投入使用之后,越来越多的人频繁地长距离地往来,时间变得越来越重要。在铁路的早期,时刻表非常让人迷惑,每一个所谓的停靠时间都是基于停靠地点的当地时间。时间的标准化对于铁路的高效运营变得非常重要。
在1878年,加拿大人Sir Sanford Fleming 提议使用一个全球的时区(这个建议被采纳,并衍生了今天我们所使用的全球时区的概念),他建议把世界分成24个时区,每一个跨越15度经线(因为地球的经度360度,划分成24块后,一块为15度)。Sir Sanford Fleming的方法解决了一个全球性的时间混乱的问题。
美国铁路公司于1883年11月18日使用了Fleming 提议的时间方式。1884年一个国际子午线会议在华盛顿召开,他的目的是选择一个合适的本初子午线。大会最终选定了格林威治为标准的0度。尽管时区被确定了下来,但是各个国家并没有立刻更改他们的时间规范,在美国,尽管到1895年已经有很多州开始使用标准时区时间,国会直到1918年才强制使用会议制定的时间规范。
今天各个国家使用的是一个Fleming时区规范的一个变种,中国一共跨越了5个时区,但是使用了一个统一的时间规范,比Coordinated Universal Time(UTC,格林威制时间)早8个小时。俄罗斯也拥护这个时区规范,尽管整个国家使用的时间和标准时区提前了1个小时。澳大利亚使用3个时区,其中主时区提前于他按Fleming规范的时区半小时。很多中东国家也使用了半时时区(即不是按照Fleming的24个整数时区)。
因为时区是对经度进行划分,在南极或者北极工作的科学家直接使用了UTC时间,否则南极大陆将被分解成24个时区。
时区的转化表如下:
UTC Coordinated Universal Time
GMT Greenwich Mean Time, 定义为 UTC
BST British Summer Time, 定义为 UTC+1 hour
IST Irish Summer Time, 定义为 UTC+1 hour
WET Western Europe Time, 定义为 UTC
WEST Western Europe Summer Time, 定义为 UTC+1 hour
CET Central Europe Time, 定义为 UTC+1
CEST Central Europe Summer Time, 定义为 UTC+2
EET Eastern Europe Time, 定义为 UTC+2
EEST Eastern Europe Summer Time, 定义为 UTC+3
MSK Moscow Time, 定义为 UTC+3
MSD Moscow Summer Time, 定义为 UTC+4
AST Atlantic Standard Time, 定义为 UTC-4 hours
ADT Atlantic Daylight Time, 定义为 UTC-3 hours
NST Newfoundland Standard Time, 定义为 UTC-3.5 hours
NDT Newfoundland Daylight Time, 定义为 UTC-2.5 hours
EST Eastern Standard Time, 定义为 UTC-5 hours
EDT Eastern Daylight Saving Time, 定义为 UTC-4 hours
CST Central Standard Time, 定义为 UTC-6 hours
CDT Central Daylight Saving Time, 定义为 UTC-5 hours
MST Mountain Standard Time, 定义为 UTC-7 hours
MDT Mountain Daylight Saving Time, 定义为 UTC-6 hours
PST Pacific Standard Time, 定义为 UTC-8 hours
PDT Pacific Daylight Saving Time, 定义为 UTC-7 hours
HST Hawaiian Standard Time, 定义为 UTC-10 hours
AKST Alaska Standard Time, 定义为 UTC-9 hours
AKDT Alaska Standard Daylight Saving Time, 定义为 UTC-8 hours
AEST Australian Eastern Standard Time, 定义为 UTC+10 hours
AEDT Australian Eastern Daylight Time, 定义为 UTC+11 hours
ACST Australian Central Standard Time, 定义为 UTC+9.5 hours
ACDT Australian Central Daylight Time, 定义为 UTC+10.5 hours
AWST Australian Western Standard Time, 定义为 UTC+8 hours
下面给出了一些时间,请在不同时区之间进行转化。
输入
输入的第一行包含了一个整数N,表示有N组测试数据。接下来N行,每一行包括一个时间和两个时区的缩写,它们之间用空格隔开。时间由标准的a.m./p.m给出。midnight表示晚上12点(12:00 a.m.),noon表示中午12点(12:00 p.m.)。
输出
假设输入行给出的时间是在第一个时区中的标准时间,要求输出这个时间在第二个时区中的标准时间。
样例输入
4
noon HST CEST 
11:29 a.m. EST GMT
6:01 p.m. CST UTC
12:40 p.m. ADT MSK
样例输出
midnight
4:29 p.m.
12:01 a.m.
6:40 p.m.
#include<stdio.h>
#include<string.h>
int difference(char*zone1,char*zone2){
	char*zone[32]={"UTC","GMT","BST","IST","WET","WEST",
		"CET","CEST","EET","EEST","MSK","MSD","AST","ADT",
		"NST","NDT","EST","EDT","CST","CDT","MST","MDT","PST",
		"PDT","HST","AKST","AKDT","AEST","AEDT","ACST","ACDT",
		"AWST"};
	float time[32]={0,0,1,1,0,1,1,2,2,3,3,4,-4,-3,-3.5,-2.5,-5,-4,-6,-5,-7,
		-6,-8,-7,-10,-9,-8,10,11,9.5,10.5,8};
	int i,j;
	for(i=0;strcmp(zone[i],zone1);i++);
	for(j=0;strcmp(zone[j],zone2);j++);
	return(int)((time[i]-time[j])*60);
}
int main()
{int nCases;
scanf("%d",&nCases);
for(int i=0;i<nCases;i++)
{char time[9];
int hours,minutes;
scanf("%s",time);
switch(time[0]){
case 'n':hours=12;
	minutes=0;
	break;
case 'm':hours=0;
	minutes=0;
	break;
default:sscanf(time,"%d:%d",&hours,&minutes);
	hours%=12;
	scanf("%s",time);
	if(time[0]=='p')
		hours+=12;
}
char timezone1[5],timezone2[5];
scanf("%s%s",timezone1,timezone2);
int newTime;
newTime=hours*60+minutes+difference(timezone2,timezone1);
if(newTime<0)
newTime+=1440;
newTime%=1440;
switch(newTime){
case 0:printf("midnight\n");
	break;
case 720:printf("noon\n");
	break;
default:hours=newTime/60;
	minutes=newTime%60;
	if(hours==0)
		printf("12:%02d a.m.\n",minutes);
	else if(hours<12)
		printf("%d:%02d a.m.\n",hours,minutes);
	else if(hours==12)
		printf("12:%02d p.m.\n",minutes);
	else 
		printf("%d:%02d p.m.\n",hours%12,minutes);
}
}
return 0;
}
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多