PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)

2023-11-08

题目集地址

报名了12月的PAT-B,先试试水。

已完成:2018/10/22 — 2018/11/14 


更新:(2018/12/09)PAT乙级考试100分!

考试代码已更新

冬天坐火车跑去考试冻懵了,来年对战PAT甲级考试!


目录

目录

题目集地址

目录

1001害死人不偿命的(3n+1)猜想

1002写出这个数

1003我要通过!

1004成绩排名

1005继续(3n+1)猜想

1006换个格式输出整数

1007素数对猜想

1008数组元素循环右移问题

1009说反话

1010一元多项式求导

1011A+B 和 C

1012数字分类

1013数素数

1014福尔摩斯的约会

1015德才论

1016部分A+B

1017A除以B

1018锤子剪刀布

1019数字黑洞

1020月饼

1021个位数统计

1022D进制的A+B

1023组个最小数

1024科学计数法

1025反转链表

1026程序运行时间

1027打印沙漏

1028人口普查

1029旧键盘

1030完美数列

1031查验身份证

1032挖掘机技术哪家强

1033旧键盘打字

1034有理数四则运算

1035插入与归并

1036跟奥巴马一起编程

1037在霍格沃茨找零钱

1038统计同成绩学生

1039到底买不买

1040有几个PAT

1041考试座位号

1042字符统计

1043输出PATest

1044火星数字

1045快速排序

1046划拳

1047编程团体赛

1048数字加密

1049数列的片段和

1050螺旋矩阵

1051复数乘法

1052卖个萌

1053住房空置率

1054求平均值

1055集体照

1056组合数的和

1057数零壹

1058选择题

1059C语言竞赛

1060爱丁顿数

1061判断题

1062最简分数

1063计算谱半径

1064朋友数

1065单身狗

1066图像过滤

1067试密码

1068万绿丛中一点红

1069微博转发抽奖

1070结绳

1071小赌怡情

1072开学寄语

1073多选题常见计分法

1074宇宙无敌加法器

1075链表元素分类

1076Wifi密码

1077互评成绩计算

1078字符串压缩与解压

1079延迟的回文数

1080MOOC期终成绩

1081检查密码

1082射击比赛

1083是否存在相等的差

1084外观数列

1085PAT单位排行

1086就不告诉你

1087有多少不同的值

1088三人行

1089狼人杀-简单版

1090危险品装箱

>>以下5题为2018/12/09PAT参赛时所写

1091N-自守数

1092最好吃的月饼

1093字符串A+B

1094谷歌的招聘

1095解码PAT准考证

END


1001害死人不偿命的(3n+1)猜想

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int num;
	scanf("%d",&num);
	int cnt=0;
	while(num!=1)
	{
		cnt++;
		if(num%2)
			num=(3*num+1)/2;
		else
			num=num/2;
	}
	printf("%d\n",cnt);
	return EXIT_SUCCESS;
} 

so so so so easy。


1002写出这个数

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char **argv)
{
	char* bignumber=(char*)calloc(105,sizeof(char));
	scanf("%s",bignumber);
	int sum=0;
	for(int i=0;i<strlen(bignumber);i++)
		sum+=bignumber[i]-'0';
	char sp[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	int list[105]={0},index=0;
	do
	{
		int now=sum%10;
		sum/=10;
		list[index++]=now;
	}
	while(sum);
	for(int i=index-1;i>=0;i--)
		printf("%s%c",sp[list[i]],i==0?'\n':' ');
	return EXIT_SUCCESS;
} 

so so easy。


1003我要通过!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	while(cnt--)
	{
		char str[105];
		scanf("%s",str);
		int state=0,i,Afront=0,Amiddle=0,Alater=0;
		for(i=0;i<strlen(str);i++)
		{
			if(str[i]!='P'&&str[i]!='A'&&str[i]!='T')
				break;
			if(str[i]=='P')
				if(state==0)
					state=1;
				else
					break;
			if(str[i]=='A')
				if(state==1)
					state=2;	
				else if(state==2)
					Amiddle++;
				else if(state==0)
					Afront++;
				else
					Alater++;
			if(str[i]=='T')
				if(state==2)
					state=3;
				else
					break;
		}
		while(Amiddle)
		{
			Alater-=Afront;
			Amiddle--;
		}
		if(i<strlen(str)||state!=3||Afront!=Alater)
			printf("NO\n");
		else
			printf("YES\n");
	}
	return EXIT_SUCCESS;
} 

分析题目三个通过条件可知。字符串中不能出现P、A、T之外的字符;PT之间只有一个A时(PAT),前后可以加上相同个数的A;PT中每多一个A(>2),后面加上前面个数个A。

统计字符串中P、T前中后A的个数判断即可。


1004成绩排名

#include<stdio.h>
#include<stdlib.h>
struct student
{
	char name[15];
	char IDnumber[15];
	int score;
};
typedef struct student student;
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	student max={"","",0},min={"","",100};
	while(cnt--)
	{
		student new;
		scanf("%s%s%d",new.name,new.IDnumber,&new.score);
		if(new.score>max.score)
			max=new;
		if(new.score<min.score)
			min=new;
	}
	printf("%s %s\n",max.name,max.IDnumber);
	printf("%s %s\n",min.name,min.IDnumber);
	return EXIT_SUCCESS;
}

so so easy。


1005继续(3n+1)猜想

#include<stdio.h>
#include<stdlib.h>
int book[4500]={0};
void getsp(int num)
{
	if(book[num])
		return;
	while(num!=1)
	{
		if(num%2)
			num=(3*num+1)/2;
		else
			num=num/2;
		book[num]=1;
	}
}
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int num;
	int array[101]={0};
	while(cnt--)
	{
		scanf("%d",&num);
		getsp(num);
		array[num]=1;
	}
	int firstblood=0;
	for(int i=100;i>0;i--)
		if(array[i]&&book[i]==0&&firstblood==0)
		{
			printf("%d",i);
			firstblood=1;
		}
		else if(array[i]&&book[i]==0)
			printf(" %d",i);
	putchar('\n');
	return EXIT_SUCCESS;
}

略坑。题目意思是第一个直接执行3n+1猜想,并记录过程中的每个数,注意是过程数;后面的每个数先判断是否已经记录过,记录过就直接跳过(记录过后面算就没意义了),没记录过就执行3n+1猜想并记录过程数。

再挨个判断每个数是否在记录中,记录中存在则输出。记录过程的数组开大点,4500左右。


1006换个格式输出整数

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int num;
	scanf("%d",&num);
	int chundred=num/100;
	while(chundred--)	putchar('B');
	num%=100;
	int cten=num/10;
	while(cten--)	putchar('S');
	num%=10;
	int st=1;
	while(num>=st)
	{
		putchar('0'+st);
		st++;	
	}
	putchar('\n');
	return EXIT_SUCCESS;
}

so so easy。


1007素数对猜想

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int getsp(int num)
{
	int sum=0;
	int history=2;
	for(int k=2;k<=num;k++)
	{
		int is=0;
		for(int i=2;i<=(int)sqrt(k);i++)
			if(k%i==0)
			{
				is=1;
				break;
			}
		if(!is&&k-history==2)
			sum++;
		if(!is)
			history=k;
	}
	return sum;
}
int main(int argc,char **argv)
{
	int num;
	scanf("%d",&num);
	printf("%d\n",getsp(num));
	return EXIT_SUCCESS;
}

挨个计算素数,判断当前值和上一个历史值之差是否为 2 。


1008数组元素循环右移问题

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int num,rr;
	scanf("%d%d",&num,&rr);
	int array[105]={0};
	for(int i=1;i<=num;i++)
		scanf("%d",&array[i]);
	int begin=num-rr%num+1;
	
	for(int i=1;i<=num;i++)
	{
		if(begin>num)
			begin=1;
		printf("%d%c",array[begin++],i==num?'\n':' ');
	}
	return EXIT_SUCCESS;
}

模拟实现汇编的 RR 。


1009说反话

#include<stdio.h>
#include<string.h>
char str[85];
int book[85][2];
int main(int argc,char** argv)
{
  	scanf("%[^\n]",str);
  	int ind,ins=strlen(str),con=0,booknow=0;
	for(ind=0;ind<ins;ind++)
	{
		if(str[ind]!=' '&&!con)
		{
			con=1;
			book[booknow][0]=ind;
		}
		else if(str[ind]==' '&&con)
		{
			con=0;
			book[booknow++][1]=ind;
		}
	}
	if(con)
		book[booknow++][1]=ins;
	for(ind=booknow-1;ind>=0;ind--)
	{
		for(ins=book[ind][0];ins<book[ind][1];ins++)
			printf("%c",str[ins]);
		printf("%c",ind==0?'\n':' ');
	}
  	return 0;
}

记录每个单词的起始和终止位置。


1010一元多项式求导

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int sp[1005][2];
	int i=0;
	while(scanf("%d%d",&sp[i][0],&sp[i][1])!=EOF)
		i++;
	int firstblood=0;
	for(int j=0;j<=i-1;j++)
		if(sp[j][0]*sp[j][1])
		{
			if(firstblood==0)
				firstblood=1;
			else
				putchar(' ');
			printf("%d %d",sp[j][0]*sp[j][1],sp[j][1]-1);
		}
	if(!firstblood)
		printf("0 0");
	putchar('\n');
	return EXIT_SUCCESS;
}

小小小坑。存在负指数。


1011A+B 和 C

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max(a,b) (a<b?b:a)
#define min(a,b) (a>b?b:a)
int main(int argc, char *argv[])
{
	int cnt;
	scanf("%d",&cnt);
	for(int i=1;i<=cnt;i++)
	{
		long long a,b,c;
		scanf("%ld%ld%ld",&a,&b,&c);
		if(a+b>c)
			printf("Case #%d: true\n",i);
		else
			printf("Case #%d: false\n",i);
	} 
	return 0;
}

so so so so easy……


1012数字分类

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int A1=0,A2=0,A3=0,A5=0,A2p=-1,A2els=0;
	double A4=0.0,A4p=0.0;
	while(cnt--)
	{
		int num;
		scanf("%d",&num);
		if(num%5==0&&num%2==0)
			A1+=num;
		if(num%5==1)
		{
			A2p*=-1;
			A2+=A2p*num;
                        A2els=1;
		}
		if(num%5==2)
		{
			A3++;
		}
		if(num%5==3)
		{
			A4+=num;
			A4p++;
		}
		if(num%5==4)
		{
			if(num>A5)
				A5=num;
		}
	}
	if(A1==0)
		printf("N ");
	else
		printf("%d ",A1);
	if(A2els==0)
		printf("N ");
	else
		printf("%d ",A2);
	if(A3==0)
		printf("N ");
	else
		printf("%d ",A3);
	if(A4p==0.0)
		printf("N ");
	else
		printf("%.1lf ",A4/A4p);
	if(A5==0)
		printf("N\n");
	else
		printf("%d\n",A5);
	return EXIT_SUCCESS;
}

小小小坑,判断每一个情况是否有值。


1013数素数

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int ispre(int num)
{
	if(num==1)
		return 0;
	if(num==2)
		return 1;
	for(int i=2;i<=num/i;i++)
	{
		if(num%i==0)
			return 0;
	}
	return 1;
}
int array[10002];
int main(int argc,char **argv)
{
	int M,N,cnt=0;
	scanf("%d%d",&M,&N);
	int i,j;
	for(i=2,j=1;j<=10000;i++)
	{
		if(ispre(i))
			array[j++]=i;
	}
	for(i=M;i<=N;i++)
	{
		cnt++;
		printf("%d",array[i]);
		if(cnt%10==0||i==N)
			printf("\n");
		else
			printf(" ");
	}
	return EXIT_SUCCESS;
} 

so so so easy,先打表,按要求依次输出。


1014福尔摩斯的约会

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(int argc,char **argv)
{
	char str1[100],str2[100],str3[100],str4[100];
	scanf("%s%s%s%s",str1,str2,str3,str4);
	char week[10][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
	int first=-1,secend=-1,third=-1;
	for(int i=0;;i++)
	{
		if(str1[i]==str2[i]&&first!=-1)
		{
			if(isdigit(str1[i]))
			{
				secend=str1[i]-'0';
				break;
			}
			else if(str1[i]>='A'&&str1[i]<='N')
			{
				secend=str1[i]-'A'+10;
				break;
			}
		}
		if(str1[i]==str2[i]&&first==-1&&(str1[i]>='A'&&str1[i]<='G'))
		{
			first=str1[i]-'A';
		}
	}
	for(int i=0;;i++)
	{
		if(str3[i]==str4[i]&&third==-1&&isalpha(str3[i]))
		{
			third=i;
			break;
		}
	}
	printf("%s %02d:%02d\n",week[first],secend,third);
	return EXIT_SUCCESS;
}

小小坑。A-N和A-G的范围不能用无脑直接用isupper……。


1015德才论

#include<stdio.h>
#include<stdlib.h>
struct man
{
	int number,de,cai;
	int rank;
};
struct man sp[100000];	
int compare(const void *a,const void *b)
{
	const struct man *as=a;
	const struct man *bs=b;
	if(as->rank!=bs->rank)
		return -(as->rank-bs->rank);
	else if((as->de+as->cai)!=(bs->de+bs->cai))
		return -(as->de+as->cai)+(bs->de+bs->cai);
	else if(as->de!=bs->de)
		return -(as->de-bs->de);
	else
		return as->number-bs->number;
}
int main(void)
{
	int N,baseline,additionline;
	scanf("%d%d%d",&N,&baseline,&additionline);
	int index=0,sum=0;
	while(N--)
	{
		int a,b,c,d;
		scanf("%d%d%d",&a,&b,&c);
		if(b<baseline||c<baseline)
			continue;
		sum++;
		if(b>=additionline&&c>=additionline)
		{
			d=4;
			sp[index].number=a;
			sp[index].de=b;
			sp[index].cai=c;
			sp[index++].rank=d;
			continue;
		}
		if(b>=additionline&&c<additionline)
		{
			d=3;
			sp[index].number=a;
			sp[index].de=b;
			sp[index].cai=c;
			sp[index++].rank=d;
			continue;
		}
		if(b>=c&&b<additionline&&c<additionline)
		{
			d=2;
			sp[index].number=a;
			sp[index].de=b;
			sp[index].cai=c;
			sp[index++].rank=d;
			continue;
		}
		d=1;
		sp[index].number=a;
		sp[index].de=b;
		sp[index].cai=c;
		sp[index++].rank=d;
	}
	qsort(sp,index,sizeof(struct man),compare);
	printf("%d\n",sum);
	for(int i=0;i<index;i++)
	{
		printf("%d %d %d\n",sp[i].number,sp[i].de,sp[i].cai);
	}
	return EXIT_SUCCESS;
}

编写compare函数借助qsort即可,STL的sort同理。


1016部分A+B

#include<stdio.h>
#include<stdlib.h>
int getnum(int sp,int key)
{
	int sumn=0;
	while(sp)
	{
		int sol=sp%10;
		if(sol==key)
			sumn=sumn*10+key;
		sp/=10;
	}
	return sumn;
}
int main(int argc,char *argv[])
{
	int a,as,b,bs;
	scanf("%d%d%d%d",&a,&as,&b,&bs);
	printf("%d\n",getnum(a,as)+getnum(b,bs));
	return EXIT_SUCCESS;
}

so easy。提取符合的每一位相加。


1017A除以B

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
	char bignumber[1005];
	char div[1005];
	scanf("%s",bignumber);
	int key;
	scanf("%d",&key);
	int mod=0,index=0,firstblood=0;
	for(int i=0;i<strlen(bignumber);i++)
	{
		mod+=bignumber[i]-'0';
		if(key>mod)
		{
			mod*=10;
			if(firstblood)
				div[index++]='0';
			continue;
		}
		if(!firstblood)
			firstblood=1;
		div[index++]=mod/key+'0';
		mod=mod%key*10;
	}
	if(index==0)
	  div[index++]='0';
	div[index]=0;
	printf("%s %d\n",div,mod/10);
	return EXIT_SUCCESS;
}

小坑,存在除数为 0 的情况。


1018锤子剪刀布

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int cnt;
	scanf("%d%*c",&cnt);
	int wina[5]={0},winb[5]={0},wa=0,wb=0,equ=0,max;
	char maxa='B',maxb='B';
	while(cnt--)
	{
		char q,w;
		scanf("%c %c%*c",&q,&w);
		if(q=='C'&&w=='J'||q=='J'&&w=='B'||q=='B'&&w=='C')
		{
			wa++;
			if(q=='B')wina[1]++;
			if(q=='C')wina[2]++;
			if(q=='J')wina[3]++;
			max=wina[1],maxa='B';
			if(wina[2]>max)
				max=wina[2],maxa='C';
			if(wina[3]>max)
				max=wina[3],maxa='J';
			continue;
		}
		else if(w=='C'&&q=='J'||w=='J'&&q=='B'||w=='B'&&q=='C')
		{
			wb++;
			if(w=='B')winb[1]++;
			if(w=='C')winb[2]++;
			if(w=='J')winb[3]++;
			max=winb[1],maxb='B';
			if(winb[2]>max)
				max=winb[2],maxb='C';
			if(winb[3]>max)
				max=winb[3],maxb='J';
			continue;
		}
		else
		  equ++;
	}
	printf("%d %d %d\n%d %d %d\n",wa,equ,wb,wb,equ,wa);
	printf("%c %c\n",maxa,maxb);
	return EXIT_SUCCESS;
}

so easy。统计输赢情况。


1019数字黑洞

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int whole;
	scanf("%d",&whole);
	int a[5],firstblood=0;
	while(whole!=6174&&whole!=0||firstblood==0)
	{
		if(!firstblood)
			firstblood=1;
		a[1]=whole%10;
		a[2]=whole/10%10;
		a[3]=whole/100%10;
		a[4]=whole/1000%10;
		for(int i=1;i<4;i++)
			for(int j=1;j<=4-i;j++)
				if(a[j]>a[j+1])
				{
					int temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				}
		int big=a[1]+a[2]*10+a[3]*100+a[4]*1000;
		int small=a[4]+a[3]*10+a[2]*100+a[1]*1000;
		whole=big-small;
		printf("%04d - %04d = %04d\n",big,small,whole);
	}
	return EXIT_SUCCESS;
}

小坑,输入是6174的情况。


1020月饼

#include<stdio.h>
#include<stdlib.h>
//#define HOST
typedef struct
{
	double si;
	double sum,num;
}moon;
moon cakes[1005]={0};
int compare(const void *a,const void *b)
{
	const moon *sa=(const moon*)a;
	const moon *sb=(const moon*)b;
	if(sb->si>sa->si)
		return 1;
	if(sb->si<sa->si)
		return -1;
	return 0; 
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int n,need;
	scanf("%d%d",&n,&need);
	for(int i=0;i<n;i++)
		scanf("%lf",&cakes[i].num);
	for(int i=0;i<n;i++)
		scanf("%lf",&cakes[i].sum);
	for(int i=0;i<n;i++)
		cakes[i].si=cakes[i].sum/cakes[i].num;
	qsort(cakes,n,sizeof(moon),compare);
	double ans=0.0;
	for(int i=0;i<n;i++)
	{
		if(need<=cakes[i].num)
		{
			ans+=cakes[i].si*need;
			break;
		}
		else
		{
			ans+=cakes[i].sum;
			need-=cakes[i].num;
		}
	}
	printf("%.2lf\n",ans);
	return EXIT_SUCCESS;
}

小坑。第二行第三行输入的库存和总价题目说明是正数,可以是小数的。


1021个位数统计

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
	char bignumber[1005];
	int book[10]={0};
	scanf("%s",bignumber);
	for(int i=0;i<strlen(bignumber);i++)
		book[bignumber[i]-'0']++;
	for(int i=0;i<10;i++)
		if(book[i])
			printf("%d:%d\n",i,book[i]);
	return EXIT_SUCCESS;
}

so so so so easy。统计各个数字出现个数输出。


1022D进制的A+B

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int* tobasenumber(long long original,int base)
{
	static int array[30]={0},index=1;
	if(!original)
	  array[index++]=0;
	while(original)
	{
		array[index++]=original%base;
		original/=base;
	}
	array[0]=index-1;
	return array;
}
int main(int argc,char *argv[])
{
	long long a,b;
	scanf("%lld%lld",&a,&b);
	long long sum=a+b;
	int base;
	scanf("%d",&base);
	int *point=tobasenumber(sum,base);
	for(int i=point[0];i>0;i--)
		printf("%d",point[i]);
	putchar('\n');
	return EXIT_SUCCESS;
}

小坑。存在和为 0 的情况。


1023组个最小数

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
	int book[10]={0};
	for(int i=0;i<10;i++)
		scanf("%d",&book[i]);
	int index=1;
	while(book[index]==0)
		index++;
	book[index]--;
	printf("%d",index);
	index=0;
	while(index<=9)
	{
		if(!book[index])
		{
			index++;
			continue;	
		}
		printf("%d",index);
		book[index]--;
	}
	putchar('\n');
	return EXIT_SUCCESS;
}

so easy。第一个数从1开始取最小数,后面的数从零开始取。


1024科学计数法

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
	char str[11000];
	scanf("%s",str);
	int ends=0;
	for(int i=1;;i++)
		if(str[i]=='E')
		{
			ends=i;
			break;
		}
	int psss=0,endall=strlen(str)-1,copyends=ends+2;
	while(endall>=copyends)
	{
		psss=psss*10+str[copyends]-'0';
		copyends++;
	}
	if(str[ends+1]=='-')
		psss=-psss;
	if(str[0]=='-')
		putchar(str[0]);
	if(psss>0)
	{
		printf("%c",str[1]);
		for(int i=0;i<ends-3||i<psss;i++)
		{
			if((i==psss)&&(i<ends-3))
				putchar('.');
			if(i<ends-3)
				putchar(str[i+3]);
			else
				putchar('0');
		}
	}
	else if(psss<0)
	{
		putchar('0');
		putchar('.');
		for(int i=1;i<abs(psss);i++)
			putchar('0');
		putchar(str[1]);
		for(int i=0;i<ends-3;i++)
			putchar(str[i+3]);
	}
	else
	{
		for(int i=1;i<ends;i++)
			putchar(str[i]);
	}
	putchar('\n');
	return EXIT_SUCCESS;
}

先把输入处理成有效数字、正负号、指数值几部分,后根据指数正、负、零,分析输出即可。


1025反转链表

#include<stdio.h>
#include<stdlib.h>
//#define HOST
typedef struct
{
	int data;
	int next;
}node;
node sp[100005]={0};
int ans[100005]={0};
void reverse(int left,int right)
{
	while(left<right)
	{
		int temp=ans[left];
		ans[left]=ans[right];
		ans[right]=temp;
		left++,right--;
	}
	return;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int begin,cnt,isp;
	scanf("%d%d%d",&begin,&cnt,&isp);
	for(int i=0;i<cnt;i++)
	{
		int temp;
		scanf("%d",&temp);
		scanf("%d%d",&sp[temp].data,&sp[temp].next);
	}
	int index=0;
	while(begin!=-1)
	{
		ans[index++]=begin;
		begin=sp[begin].next;
	}
	for(int i=0;i<(index)/isp;i++)
	{
		int left=i*isp,right=(i+1)*isp-1;
		reverse(left,right);
	}
	printf("%05d %d",ans[0],sp[ans[0]].data);
	for(int i=1;i<index;i++)
		printf(" %05d\n%05d %d",ans[i],ans[i],sp[ans[i]].data);
	printf(" -1\n");
	return EXIT_SUCCESS;
}

读取链表数据,转换成数组存储。逐一反转数组即可。


1026程序运行时间

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int time1,time2;
	scanf("%d%d",&time1,&time2);
	float time=(time2-time1)/100.0-(time2-time1)/100;
	if(time>=0.5)
		time=(time2-time1)/100+1;
	else
		time=(time2-time1)/100;
	int sp=time;
	printf("%02d:%02d:%02d\n",sp/3600,sp%3600/60,sp%3600%60);
	return EXIT_SUCCESS;
}

so so easy。得到程序运行秒数后,四舍五入成整数后按格式输出。


1027打印沙漏

#include<stdio.h>
int main(int argc,char** argv)
{
	int sum;
	char ch;
	scanf("%d %c",&sum,&ch);
	int i=1,msum=1,fk=sum-msum;
	while(fk>=(i+2)*2)
	{
		i+=2;
		msum+=2*i;
		fk=sum-msum;
	}
	int ins=i;
	while(ins>1)
	{
		int ind=ins,inf=(i-ins)/2;
		while(inf--)
			putchar(' ');
		while(ind--)
			putchar(ch);
		putchar('\n');
		ins-=2;
	}
	int inf=(i-1)/2;
	while(inf--)
		putchar(' ');
	putchar(ch);
	putchar('\n');
	ins=3;
	while(ins<=i)
	{
		int ind=ins,inf=(i-ins)/2;
		while(inf--)
			putchar(' ');
		while(ind--)
			putchar(ch);
		putchar('\n');
		ins+=2;
	}
	printf("%d\n",fk);
	return 0;
}

老题目,先计算好沙漏第一行字符个数和剩余值,循环输出即可。


1028人口普查

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct member
{
	char name[10];
	int year,month,day;
}member;

int compare(member x,member y)
{
	if(x.year==y.year)
		if(x.month==y.month)
			if(x.day==y.day)
				return 0;
			else
				return x.day-y.day;
		else
			return x.month-y.month;
	else
		return x.year-y.year;
}
int check(member x)
{
	if(x.year>2014)
		return 1;
	if(x.year==2014)
	{
		if(x.month>9)
			return 1;
		if(x.month==9)
			if(x.day>6)
				return 1;
	}
	if(x.year<1814)
		return 1;
	if(x.year==1814)
	{
		if(x.month<9)
			return 1;
		if(x.month==9)
			if(x.day<6)
				return 1;
	}
	return 0;
}
int main(int argc, char *argv[])
{
	int cnt;
	scanf("%d",&cnt);
	member maxn,minn;
	int sumcurrect=0,firstblood=0;
	while(cnt--)
	{
		member now;
		scanf("%s%d/%d/%d",now.name,&now.year,&now.month,&now.day);
		if(check(now))
			continue;
		sumcurrect++;
		if(!firstblood)
		{
			firstblood=1;
			maxn=minn=now;
		}
		else
		{
			if(compare(now,maxn)>0)
				maxn=now;
			if(compare(minn,now)>0)
				minn=now;	
		}		
	}
	if(firstblood)
		printf("%d %s %s\n",sumcurrect,minn.name,maxn.name);
	else
		printf("0\n");
	return 0;
}

天坑。存在没有一个满足的人的情况(只输出一个 0 ),还需考虑只有一个满足的人的情况(最大最小输出同一个人的名字)。


1029旧键盘

#include<stdio.h>
#include<ctype.h>
int book[128]={0};
char stack[1000]={0};
int main(int argc,char** agrv)
{
	char str1[1000],str2[1000];
	scanf("%s%s",str1,str2);
	int point1=0,point2=0,point3=0;
	while(str1[point1])
	{
		if(str1[point1]==str2[point2])
		{
			point1++;
			point2++;
		}
		else
		{
			int sp=toupper(str1[point1]);
			if(book[sp]==0)
			{
				book[sp]=1;
				stack[point3++]=sp;
			}
			point1++;
		}
	}
	stack[point3]=0;
	printf("%s\n",stack);
	return 0;
}

so easy。


1030完美数列

#include<stdio.h>
#include<stdlib.h>
#define max(x,y) ((x>y)?(x):(y))
long long array[100005];
int compare(const void *a,const void *b)
{
	return (*(long long*)a-*(long long*)b);
}
int main(int argc,char **argv)
{
	int cnt,k;
	scanf("%d%d",&cnt,&k);
	for(int i=0;i<cnt;i++)
	{
		scanf("%lld",&array[i]);
	}
	qsort(array,cnt,sizeof(long long),compare);
	int sp=0;
	for(int i=0;i<cnt;i++)
		for(int j=i+sp;j<cnt;j++)
			if(array[i]*k<array[j])
				break;
			else
				sp=max(sp,j-i+1);
	printf("%d\n",sp);
	return EXIT_SUCCESS;
}

排序后循环查找最大可能值。


1031查验身份证

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int cnt;
	scanf("%d",&cnt);
	int table[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	int allok=1;
	while(cnt--)
	{
		char idcardnumber[20];
		scanf("%s",idcardnumber);
		int sum=0;
		for(int i=0;i<17;i++)
			sum+=(idcardnumber[i]-'0')*table[i];
		sum%=11;
		char book[20]={'1','0','X','9','8','7','6','5','4','3','2'};
		if(book[sum]!=idcardnumber[17])
		{
			if(allok)
				allok=0;
			printf("%s\n",idcardnumber);
		}
	}
	if(allok)
		printf("All passed\n");
	return EXIT_SUCCESS;
}

按所给计算方法判断是否通过。


1032挖掘机技术哪家强

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int cnt,max=0;
	scanf("%d",&cnt);
	int *array=(int*)calloc(100005,sizeof(int));
	while(cnt--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		array[a]+=b;
		if(array[max]<array[a])
			max=a;
	}
	printf("%d %d\n",max,array[max]);
	free(array);
	return EXIT_SUCCESS;
}

so easy。


1033旧键盘打字

#include <stdio.h>
#include <ctype.h>
int main(int argc,char** argv)
{
 char A[128] = {0}, ch;
 while ((ch = getchar()) != '\n')
  A[ch]++;
 while ((ch = getchar()) != '\n')
  if ((isupper(ch) && A[43]) || A[toupper(ch)])
  continue;
  else
  putchar(ch);
 return 0;
}

记录第一个字符串出现字符,过滤第二个字符串。


1034有理数四则运算

#include<stdio.h>
#include<stdlib.h>
#define mabs(a) (a<0?(-a):(a))
long long gcd(long long m,long long n)
{
	if(m<0)
		m=-m;
	if(n<0)
		n=-n;
	return (m%n?gcd(n,m%n):n);
}
void printnum(long long a,long long b)
{
    if (b == 0)
	{
        printf("Inf");
        return;
    }
    int sign=1;
    if((a<0&&b>0)||(a>0&&b<0))
    {
    	sign=-1;
	}
	a=mabs(a);
	b=mabs(b);
    int temp=gcd(a, b);
    a/=temp;
    b/=temp;
    if(sign==-1)
		printf("(-");
    if(b==1)
        printf("%lld", a);
	else if(a>b)
        printf("%lld %lld/%lld",a/b,a%b,b);
    else
        printf("%ld/%ld", a, b);
    if(sign==-1)
		printf(")");
	return;
}
int main(int argc,char **argv)
{
	long long a[2],b[2];
	scanf("%lld/%lld %lld/%lld",&a[0],&a[1],&b[0],&b[1]);
	printnum(a[0],a[1]);
	printf(" + ");
	printnum(b[0],b[1]);
	printf(" = ");
	printnum(a[0]*b[1]+a[1]*b[0],a[1]*b[1]);
	putchar('\n');
	printnum(a[0],a[1]);
	printf(" - ");
	printnum(b[0],b[1]);
	printf(" = ");
	printnum(a[0]*b[1]-a[1]*b[0],a[1]*b[1]);
	putchar('\n');
	printnum(a[0],a[1]);
	printf(" * ");
	printnum(b[0],b[1]);
	printf(" = ");
	printnum(a[0]*b[0],a[1]*b[1]);
	putchar('\n');
	printnum(a[0],a[1]);
	printf(" / ");
	printnum(b[0],b[1]);
	printf(" = ");
	printnum(a[0]*b[1],a[1]*b[0]);
	putchar('\n');
	return EXIT_SUCCESS;
}

坑。必须使用long long。分成两部分,一部分是直接计算分子、分母值及格式输出;另一部分是化简分子、分母为要求的格式。


1035插入与归并

#include<stdio.h>
#include<stdlib.h>
//#define HOST
void InsertionSort(int *arr,int begin,int len) 
{
	if(begin>=len)
		begin=len-1;
	int temp=arr[begin];
	for(int i=begin-1;i>=0;i--)
	{
		if(arr[i]>temp)
			arr[i+1]=arr[i],arr[i]=temp;
		else
		 	break;
 	}
 	return;
}
void MergeSort(int *arr,int begin,int len)
{
	if(begin>=len)
		begin=len;
	int start=0,end=0;
	for(int i=0;i<len;i+=begin)
	{
		start=i;
		end=(start+begin>len?len:start+begin);
		for(int m=end-1;m>=start;m--)
		{
			int iloc=-1,max=arr[start],l=0;
			for(l=start;l<=m;l++)
				if(arr[l]>=max)
					iloc=l,max=arr[l]; 
			if(iloc>=0)
				arr[iloc]=arr[l-1],arr[l-1]=max;  
		}
	}
	return;
}
int match(int *diff1,int *diff2,int len)
{
    for(int i=0;i<len;i++)
    	if(diff1[i]!=diff2[i])
			return 0;
    return 1;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
    int cnt,num1[105]={0},num2[105]={0},num1s[105]={0};
    scanf("%d",&cnt);
    for(int i=0;i<cnt;i++)
		scanf("%d",&num1[i]);
    for(int i=0;i<cnt;i++)
		scanf("%d",&num2[i]);
    for(int i=0;i<cnt;i++) 
		num1s[i]=num1[i];
    for(int i=1;i<cnt;i++)
    {
        InsertionSort(num1s,i,cnt);
        if(match(num2,num1s,cnt))
        {
            printf("Insertion Sort\n"); 
            InsertionSort(num1s,i+1,cnt);
            for(int j=0;j<cnt;j++)
				printf("%d%c",num1s[j],j==cnt-1?'\n':' ');
            return EXIT_SUCCESS;
        }
    }
    for(int i=1;i<=2*cnt;i*=2)
    {
        MergeSort(num1,i,cnt);
        if(match(num2,num1,cnt))
        {
            printf("Merge Sort\n");
            MergeSort(num1,2*i,cnt);
            for(int j=0;j<cnt;j++)
				printf("%d%c",num1[j],j==cnt-1?'\n':' ');
            return 0;
        }
    }       
    return EXIT_SUCCESS;
}

考察插入排序和归并排序。一步一步进行插入/归并排序,如果出现与目标序列一致则输出排序种类,再进行一次对应排序后输出序列。


1036跟奥巴马一起编程

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int cnt;
	char ch;
	scanf("%d %c",&cnt,&ch);
	for(int i=1;i<=cnt;i++)
		putchar(ch);
	putchar('\n');
	for(int i=1;i<=(int)((cnt/2.0)+0.5)-2;i++)
	{
		putchar(ch);
		for(int j=1;j<=cnt-2;j++)
			putchar(' ');
		putchar(ch);
		putchar('\n');
	}
	for(int i=1;i<=cnt;i++)
		putchar(ch);
	putchar('\n');	
	return EXIT_SUCCESS;
}

so easy。


1037在霍格沃茨找零钱

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int a,b,c;
	int x,y,z;
	scanf("%d.%d.%d",&a,&b,&c);
	scanf("%d.%d.%d",&x,&y,&z);
	int abc,xyz;
	abc=c+b*29+a*17*29;
	xyz=z+y*29+x*17*29;
	abc-=xyz;
	if(abc>0)
		putchar('-');
	else
		abc=-abc;
	printf("%d.%d.%d\n",abc/(17*29),abc%(17*29)/29,abc%(17*29)%29);
	return EXIT_SUCCESS;
}

so easy。单位转换。


1038统计同成绩学生

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int *array=(int*)calloc(101,sizeof(int));
	int cnt;
	scanf("%d",&cnt);
	while(cnt--)
	{
		int score;
		scanf("%d",&score);
		array[score]++;
	}
	scanf("%d",&cnt);
	while(cnt--)
	{
		int sp;
		scanf("%d",&sp);
		printf("%d",array[sp]);
		if(cnt)
			printf(" ");
	}
	free(array);
	return EXIT_SUCCESS;
}

so so so easy。


1039到底买不买

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int *array=(int*)calloc(128,sizeof(int));
	char sp;
	int total=0;
	while(sp=getchar(),sp!='\n')
	{
		array[sp]++;
		total++;	
	}
	while(sp=getchar(),sp!='\n')
	{
		array[sp]--;
		total--;	
	}
	int require=0,none=1,redundant=0;
	for(int i=1;i<128;i++)
	{
		if(array[i]<0)
		{
			if(none)
				none=0;
			require+=-array[i];		
		}
		if(array[i]>0)
			redundant+=array[i]; 
	}
	if(none)
		printf("Yes %d\n",redundant);
	else
		printf("No %d\n",require);
	free(array);
	return EXIT_SUCCESS;
}

根据第一个字符串统计第二个字符串,多出/缺少的字符数。


1040有几个PAT

#include<stdio.h>
#include<stdlib.h>
#define MOD 1000000007
int main(int argc,char *argv[])
{
	int p=0,pa=0,pat=0;
	char sp;
	while(sp=getchar(),sp!='\n')
	{
		if(sp=='P')
			p++;
		if(sp=='A')
		{
			pa+=p;
			pa%=MOD;
		}
		if(sp=='T')
		{
			pat+=pa;
			pat%=MOD;
		}
	}
	printf("%d\n",pat);
	return EXIT_SUCCESS;
}

每个A都可以和前面任意一个P配对,每个T都可以和前面任意一个PA配对。还需不断的取余。

(a+b+c)%d==(a%d+b%d+c%d)%d


1041考试座位号

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
	char ID[20];
	int num;
}student;
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	student *sp=(student*)calloc(cnt+1,sizeof(student));
	while(cnt--)
	{
		student now;
		int index;
		scanf("%s %d %d",now.ID,&index,&now.num);
		strcpy(sp[index].ID,now.ID);
		sp[index].num=now.num;
	}
	scanf("%d",&cnt);
	while(cnt--)
	{
		int index;
		scanf("%d",&index);
		printf("%s %d\n",sp[index].ID,sp[index].num);
	}
	free(sp);
	return EXIT_SUCCESS;
} 

so easy。结构体数组存取。


1042字符统计

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(int argc,char **argv)
{
	int alpha[26]={0};
	char ch;
	while((ch=getchar())!=EOF)
		if(isalpha(ch))
			alpha[tolower(ch)-'a']++;
	int max=0,sp;
	for(int i=25;i>=0;i--)
		if(alpha[i]>=max)
			sp=i,max=alpha[i];
	printf("%c %d\n",sp+'a',max);
	return EXIT_SUCCESS;
} 

将字母变成小写后,统计出现个数。逆序查找最大值。


1043输出PATest

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(int argc,char **argv)
{
	int alpha[7]={0};
	char ch;
	int sum=0;
	while((ch=getchar())!=EOF)
	{
		if(ch=='P')
			alpha[1]++,sum++;
		if(ch=='A')
			alpha[2]++,sum++;
		if(ch=='T')
			alpha[3]++,sum++;
		if(ch=='e')
			alpha[4]++,sum++;
		if(ch=='s')
			alpha[5]++,sum++;
		if(ch=='t')
			alpha[6]++,sum++;
	}
	char sp[7]={0,'P','A','T','e','s','t'};
	while(sum)
		for(int i=1;i<=6;i++)
			if(alpha[i]>0)
			{
				alpha[i]--;
				sum--;
				putchar(sp[i]);
			}
	return EXIT_SUCCESS;
}

so so easy,筛选输出。


1044火星数字

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
char mars1[13][4]={"","tam","hel","maa","huh","tou","kes",\
"hei","elo","syy","lok","mer","jou"};
char mars2[13][5]={"tret","jan","feb","mar","apr","may","jun",\
"jly","aug","sep","oct","nov","dec"};
void tomars(int num)
{
	int sp1=num/13,sp2=num%13;
	if(sp1)
		printf("%s",mars1[sp1]);
	if(sp1&&sp2)
		putchar(' ');
	if((!sp2&&!sp1)||sp2)
		printf("%s",mars2[sp2]);
	putchar('\n');
	return;
}
void toearth(char *str)
{
	int sum=0;
	char temp[4]="",temps[5]="";
	sscanf(str,"%s%s",temp,temps);
	int sp1,sp2;
	for(int i=1;i<=12;i++)
		if(!strcmp(mars1[i],temp))
		{
			sum+=i*13;
			break;
		}
	for(int i=0;i<=12;i++)
		if(!strcmp(mars2[i],temps)||!strcmp(mars2[i],temp))
		{
			sum+=i;
			break;
		}
	printf("%d\n",sum);
	return;
}
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	while(cnt--)
	{
		char str[20]={0};
		scanf("%*c%[^\n]",str);
		if(isdigit(str[0]))
		{
			int num;
			sscanf(str,"%d",&num);
			tomars(num);
		}
		else
			toearth(str);
	}
	return EXIT_SUCCESS;
} 

花里胡哨版进制转换,用sscanf从字符串中读取可以简便许多。


1045快速排序

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int sp[100001][3],dp[100001];
	for(int i=0;i<cnt;i++)
		scanf("%d",&sp[i][0]);
	int leftmax=0;
	for(int i=0;i<cnt;i++)
	{
		sp[i][1]=leftmax;
		if(sp[i][0]>leftmax)
			leftmax=sp[i][0];
	}
	int rightmin=1<<30;
	for(int i=cnt-1;i>=0;i--)
	{
		sp[i][2]=rightmin;
		if(sp[i][0]<rightmin)
			rightmin=sp[i][0];
	}
	int index=0,sum=0;
	for(int i=0;i<cnt;i++)
	{
		int ok=1;
		if(sp[i][1]>=sp[i][0])
			ok=0;
		if(sp[i][2]<=sp[i][0])
			ok=0;
		if(ok)
		{
			sum++;
			dp[index++]=sp[i][0];
		}
	}
	printf("%d\n",sum);
	for(int i=0;i<index;i++)
	{ 
		printf("%d",dp[i]);
		if(i!=index-1)
			putchar(' '); 
	}
	putchar('\n');
	return EXIT_SUCCESS;
} 

此题天坑!首先如果输入 0 的话,得到的输出应该是 0后面跟两个回车……测试点2就是输入为0。

其次,题目中说按递增顺序输出这些元素。意思是按原顺序输出,并不用递增排序。

于是跑一遍左侧最大值、右侧最小值,选择满足要求的输出就完事了……


1046划拳

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int suma=0,sumb=0;
	while(cnt--)
	{
		int a,b,sa,sb;
		scanf("%d%d%d%d",&a,&sa,&b,&sb);
		if(a+b==sa&&a+b!=sb)
			suma++;
		if(a+b==sb&&a+b!=sa)
			sumb++;
	}
	printf("%d %d\n",sumb,suma);
	return EXIT_SUCCESS;
}

so so so so easy。


1047编程团体赛

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt;
	int score[1001]={0};
	scanf("%d",&cnt);
	while(cnt--)
	{
		int team,member;
		scanf("%d-%*d",&team);
		scanf("%d",&member);
		score[team]+=member;
	}
	int max=0;
	for(int i=1;i<=1000;i++)
	{
		if(score[i]>score[max])
			max=i;
	}
	printf("%d %d\n",max,score[max]);
	return EXIT_SUCCESS;
}

so so so easy。


1048数字加密

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char gotch(int num)
{
	if(num>=0&&num<=9)
		return num+'0';
	else if(num==10)
		return 'J';
	else if(num==11)
		return 'Q';
	else if(num==12)
		return 'K';
	return -1;
}
int main(int argc,char **argv)
{
	char *ans=NULL,*other=NULL;
	char num1[105],num2[105];
	scanf("%s%s",num1,num2);
	int i,sp=1;
	int len1=strlen(num1)-1,len2=strlen(num2)-1;
	if(len1>len2)
		ans=num1;
	else
		ans=num2;
	for(i=strlen(ans)-1;i>=0;i--)
	{
		char temp1,temp2;
		if(len1<0)
			temp1='0';
		else
			temp1=num1[len1--];
		if(len2<0)
			temp2='0';
		else
			temp2=num2[len2--];
		if(sp)
		{
			ans[i]=gotch(((temp1-'0')+(temp2-'0'))%13);
			sp=0;
		}
		else
		{		
			ans[i]=temp2-temp1;
			if(ans[i]<0)
				ans[i]+='0'+10;
			else
				ans[i]+='0';
			sp=1;
		}
	}
	printf("%s\n",ans);
	return EXIT_SUCCESS;
} 

天坑!题目并没有说明白数字A可能比数字B长,测试点2和5就是数字A比数字B长的情况,这时需要短的数字补零。

显而易见的做法是反转字符串,然后把短的补零,再逐位计算。

。。然而我并不想写reverse函数。

1.判断哪个数字长,指针指向长的数字。

2.两数字从个位开始逐位计算,如果有一个数字的索引 <0 则去值为 ‘0’ 。

3.输出指针所指的字符串。


1049数列的片段和

#include<iostream>
using namespace std;
int main(int argc,char *argv[])
{
    int cnt;cin>>cnt;
    long double sum=0.0;
    for(int i=1;i<=cnt;++i)
    {
        long double temp;cin>>temp;
        sum+=temp*i*(cnt+1-i);
    }
    printf("%.2Lf\n",sum);
    return 0;
}

每个数出现的个数是(左边数的个数+1)*(右边数的个数+1)。


1050螺旋矩阵

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int compare(const void *a,const void *b)
{
	return -*(const int*)a+*(const int*)b;
}
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int i,j,index=1;
	int *array=(int*)calloc(cnt+1,sizeof(int));
	for(i=1;i<=cnt;i++)
		scanf("%d",&array[i]);
	qsort(array+1,cnt,sizeof(int),compare); 
	int n=(int)floor(sqrt(cnt)),m;
	while(cnt%n)
		n--;
	m=cnt/n;
	int **matrix=(int**)calloc(m+5,sizeof(int*));
	for(i=0;i<=m+5;i++)
		matrix[i]=(int*)calloc(n+5,sizeof(int));
	i=j=1;
	while(cnt>0)
	{
		while(matrix[i][j]==0&&j<=n)
			matrix[i][j++]=array[index++],cnt--;
		j--,i++;
		while(matrix[i][j]==0&&i<=m)
			matrix[i++][j]=array[index++],cnt--;
		i--,j--;
		while(matrix[i][j]==0&&j>=1)
			matrix[i][j--]=array[index++],cnt--;
		j++,i--;
		while(matrix[i][j]==0&&i>=1)
			matrix[i--][j]=array[index++],cnt--;
		i++,j++;
	}
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			printf("%d%c",matrix[i][j],j==n?'\n':' ');
	return EXIT_SUCCESS;
}

free函数竟然会导致运行时错误。。肯能是PAT这里只能申请堆内存不能释放??

没有说明N的大小范围,须动态申请内存空间。


1051复数乘法

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	double R1,R2,P1,P2;
	scanf("%lf%lf%lf%lf",&R1,&P1,&R2,&P2);
	double t1=R1*cos(P1),r1=R1*sin(P1),t2=R2*cos(P2),r2=R2*sin(P2);
	double ans1=t1*t2-r1*r2;
	double ans2=t1*r2+t2*r1;
	if(ans1>-0.005&&ans1<0.0)
		ans1=0.0;
	if(ans2>-0.005&&ans2<0.0)
		ans2=0.0;
	printf("%.2lf%+.2lfi\n",ans1,ans2); 
	return EXIT_SUCCESS;
}

小坑。须注意 0.0 ~ -0.005 之间四舍五入成 -0.0 的问题,应是 +0.0 。


1052卖个萌

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int get(char out[][10])
{
	char temp;
	int index=0,spdex=0;
	while((temp=getchar())!='\n')
	{
		if(temp=='[')
		{
			index=0;
			while((temp=getchar())!=']')
				out[spdex][index++]=temp;
			out[spdex][index]=0;
			spdex++;
		}
	}
	return spdex;
}
int main(int argc,char **argv)
{
	char shou[15][10]={0};
	char yan[15][10]={0};
	char kou[15][10]={0};
	int shoumax=get(shou);
	int yanmax=get(yan);
	int koumax=get(kou);
	int cnt; 
	scanf("%d",&cnt);
	while(cnt--)
	{
		int t1,t2,t3,t4,t5;
		scanf("%d%d%d%d%d",&t1,&t2,&t3,&t4,&t5);
		if((t1<1||t1>shoumax)||(t2<1||t2>yanmax)||(t3<1||t3>koumax)||(t4<1||t4>yanmax)||(t5<1||t5>shoumax))
		{
			printf("Are you kidding me? @\\/@\n");
			continue;
		}
		printf("%s",shou[t1-1]);
		putchar('(');
		printf("%s",yan[t2-1]);
		printf("%s",kou[t3-1]);
		printf("%s",yan[t4-1]);
		putchar(')');
		printf("%s",shou[t5-1]);
		putchar('\n');
	}
	return EXIT_SUCCESS;
} 

小坑。不知道是不是编码类型不对,在笔记本上运行读取不了貌似是日语的字符。一开始用扫描集读取一行也失败了,失败原因应该就是日语字符读取失败直接退出了。


1053住房空置率

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt,lday; 
	double limit;
	scanf("%d%lf%d",&cnt,&limit,&lday);
	int maybe=0,able=0;
	for(int j=0;j<cnt;j++)
	{
		int cnts,mb=0;
		double input;
		scanf("%d",&cnts);
		for(int i=0;i<cnts;i++)
		{
			scanf("%lf",&input);
			if(input<limit)
				mb++;
		}
		if(mb>(cnts/2))
		{
			if(cnts>lday)
				able++;
			else
			 	maybe++;
		}
	}
	printf("%.1lf%% %.1lf%%\n",(double)maybe/cnt*100.0,(double)able/cnt*100.0);
	return EXIT_SUCCESS;
} 

坑!题目中说的是“ 若观察期超过某给定阈值 ”,并不是低于电量低于某给定的阈值e的天数…

看题的时候想当然了,理解错的话测试点1,2就会过不去。


1054求平均值

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>
bool check(char *s)
{
	int i=0;
	if(s[0]=='-')
		i++;
	for(;s[i]&&s[i]!='.';i++)
		if(!isdigit(s[i]))
			return false; 
	if(s[i]=='.')
		for(int j=i+1;s[j];j++)
			if(!isdigit(s[j])||j-i>2)
				return false;  
	double temp=fabs(atof(s));
	if(temp>1000.0)
		return false;
	return true;
}
int main(int argc,char **argv) 
{
	int cnt;
	scanf("%d",&cnt);
	int ins=0;
	double sum=0.0;
	while(cnt--)
	{
		char str[100]={0};
		scanf("%s",str);
		if(check(str))
		{
			ins++;
			sum+=atof(str);
		}
		else
			printf("ERROR: %s is not a legal number\n",str);
	}
	if(ins)
	{
		if(ins==1)
			printf("The average of 1 number is %.2lf\n",sum);
		else
			printf("The average of %d numbers is %.2f\n",ins,sum/ins);
	}
	else
		printf("The average of 0 numbers is Undefined\n");
	return EXIT_SUCCESS; 
}

一上来就想用个sscanf骚操作。。一番操作浪费了一个多小时……

然后老老实实的先判断再 atof(str) 了。。。


1055集体照

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
	char name[10];
	int high;
}student;
int compare(const void *a,const void *b)
{
	const student *sa=a;
	const student *sb=b;
	if(sa->high==sb->high)
		return strcmp(sa->name,sb->name);
	else
		return sb->high-sa->high;
}
int main(int argc,char **argv)
{
	int cnt,row;
	scanf("%d%d",&cnt,&row);
	int div=cnt/row,column=cnt%div+div;
	student class[10005];
	for(int i=0;i<cnt;i++)
		scanf("%s%d",class[i].name,&class[i].high);
	qsort(class,cnt,sizeof(student),compare);
	int temp[100005]={0},sum=1,index=0;
	temp[column/2+1]=index++;
	for(int i=1;;i++)
	{
		if(sum>=column)
			break;
		temp[column/2+1-i]=index++;
		sum++;
		if(sum>=column)
			break;
		temp[column/2+1+i]=index++;
		sum++;
	}
	for(int i=1;i<=column;i++)
		printf("%s%c",class[temp[i]].name,i==column?'\n':' ');
	for(int i=row-1;i>=1;i--)
	{
		sum=1;
		temp[div/2+1]=index++;
		int offset=1; 
		while(1)
		{
			if(sum>=div)
				break;
			temp[div/2+1-offset]=index++;
			sum++;
			if(sum>=div)
				break;
			temp[div/2+1+offset]=index++;
			sum++;
			offset++;
		}
		for(int j=1;j<=div;j++)
			printf("%s%c",class[temp[j]].name,j==div?'\n':' ');
	}
	return EXIT_SUCCESS;
} 

从高到低+字典序升序排列后,每一行安排好对应位置的编号,再依次输出即可。


1056组合数的和

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt; 
	scanf("%d",&cnt);
	int array[10]={0};
	for(int i=0;i<cnt;i++)
		scanf("%d",&array[i]);
	int sum=0;
	for(int i=0;i<cnt;i++)
		for(int j=0;j<cnt;j++)
		{
			if(i==j)
				continue;
			sum+=array[i]*10+array[j];
		}
	printf("%d\n",sum);
	return EXIT_SUCCESS;
} 

so so so so easy。


1057数零壹

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int main(int argc,char **argv)
{
	char str[100005]={0};
	scanf("%[^\n]",str);
	unsigned int sum=0;
	for(int i=0;i<strlen(str);i++)
	{
		if(isalpha(str[i]))
		{
			char ch=tolower(str[i]);
			sum+=ch-'a'+1;
		}
	}
	int zero=0,one=0;
	while(sum)
	{
		if(sum&1)
			one++;
		else
			zero++;
		sum>>=1;
	}
	printf("%d %d\n",zero,one);
	return EXIT_SUCCESS;
} 

so so so so easy。


1058选择题

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#define HOST
typedef struct
{
	int score;
	int anssum;
	int anscnt;
	char ans[6];
}subject;
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt1,cnt2;
	scanf("%d%d",&cnt1,&cnt2);
	subject sp[105];
	for(int i=0;i<cnt2;i++)
	{
		scanf("%d%d%d",&sp[i].score,&sp[i].anssum,&sp[i].anscnt);
		for(int j=0;j<sp[i].anscnt;j++)
			scanf("%*c%c",&sp[i].ans[j]);
		sp[i].ans[sp[i].anscnt]=0;
	}
	int book[105]={0},bookmax=0;
	while(cnt1--)
	{
		int sum=0;
		for(int i=0;i<cnt2;i++)
		{
			while(getchar()!='(');
			int xuan;
			char xuanans[6]={0};
			scanf("%d",&xuan);
			for(int j=0;j<xuan;j++)
				scanf("%*c%c",&xuanans[j]);
			getchar();
			if(xuan!=sp[i].anscnt||strcmp(xuanans,sp[i].ans))
			{
				book[i]++;
				if(book[i]>bookmax)
					bookmax=book[i];
				continue;
			}
			sum+=sp[i].score;
		}
		printf("%d\n",sum);
	}
	if(!bookmax)
		printf("Too simple\n");
	else
	{
		printf("%d",bookmax);
		for(int i=0;i<cnt2;i++)
			if(book[i]==bookmax)
				printf(" %d",i+1);
		putchar('\n');
	}
	return EXIT_SUCCESS;
} 

比对学生答案的字符串与标准字符串是否一致即可。


1059C语言竞赛

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>
//#define HOST
bool check(int num)
{
	int i;
	for(i=2;i<=(int)sqrt(num);i++)
		if(num%i==0)
			break;
	if(i>(int)sqrt(num))
		return true;
	return false;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,ID[10005]={0}; 
	scanf("%d",&cnt);
	for(int i=1;i<=cnt;i++)
	{
		int temp;
		scanf("%d",&temp);
		ID[temp]=i;	
	}
	scanf("%d",&cnt);
	while(cnt--)
	{
		int temp;
		scanf("%d",&temp);
		if(!ID[temp])
			printf("%04d: Are you kidding?\n",temp);
		else if(ID[temp]==-1)
			printf("%04d: Checked\n",temp);
		else
		{
			if(ID[temp]==1)
				printf("%04d: Mystery Award\n",temp);
			else if(check(ID[temp]))
				printf("%04d: Minion\n",temp);
			else
				printf("%04d: Chocolate\n",temp);
			ID[temp]=-1;
		}
	}
	return EXIT_SUCCESS;
}

so easy。


1060爱丁顿数

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int compare(const void *a,const void *b)
{
	return *(const int*)b-*(const int*)a;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt; 
	scanf("%d",&cnt);
	int array[100005];
	for(int i=0;i<cnt;i++)
		scanf("%d",&array[i]);
	qsort(array,cnt,sizeof(int),compare);
	int i;
	for(i=0;i<cnt;i++)
		if(array[i]<=i+1)
		{
			printf("%d\n",i);
			break;
		}
	if(i==cnt)
		printf("%d\n",i);
	return EXIT_SUCCESS;
}

递减排序后,遍历查找第一个不符合 array[i] > i+1 的位置输出即可。不要忘记全都满足的情况,测试点3就是此情况。


1061判断题

#include<stdio.h>
#include<stdlib.h>
//#define HOST
_Bool ans[105];
int score[105]={0};
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int stnum,tinum;
	scanf("%d%d",&stnum,&tinum);
	for(int i=1;i<=tinum;i++)
		scanf("%d",&score[i]);
	for(int i=1;i<=tinum;i++)
		scanf("%hd",&ans[i]);
	while(stnum--)
	{
		int temp,sum=0;
		for(int i=1;i<=tinum;i++)
		{
			scanf("%d",&temp);
			if(temp==ans[i])
				sum+=score[i];
		}
		printf("%d\n",sum);
	}
	return EXIT_SUCCESS;
}

so so so so easy。


1062最简分数

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>
//#define HOST
int gcd(int m,int n)
{
	return (m%n?(gcd(n,m%n)):(n));
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int zi1,zi2,mu1,mu2,aim;
	scanf("%d/%d",&zi1,&mu1);
	scanf("%d/%d",&zi2,&mu2);
	scanf("%d",&aim);
	double qzi1=(zi1*((double)aim/(double)mu1));
	double qzi2=(zi2*((double)aim/(double)mu2));
	if(qzi1>qzi2)
	{double temp=qzi1;qzi1=qzi2;qzi2=temp;}
	zi1=(int)floor(qzi1);
	zi2=(int)ceil(qzi2);
	bool ok=false;
	for(int i=zi1+1;i<zi2;i++)
	{
		int temp=gcd(i,aim);
		if(temp==1)
			if(ok==false)
				printf("%d/%d",i,aim),ok=true;
			else
				printf(" %d/%d",i,aim);
	}
	putchar('\n');
	return EXIT_SUCCESS;
}

小坑。注意是两分数之间,并不包括两分数。


1063计算谱半径

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,a,b;
	double maxp=0.0;
	scanf("%d",&cnt);
	while(cnt--)
	{
		scanf("%d%d",&a,&b);
		double temp=sqrt(a*a+b*b);
		if(temp>maxp)
			maxp=temp;	
	}
	printf("%.2lf\n",maxp);
	return EXIT_SUCCESS;
}

so so so so easy。


1064朋友数

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int getsum(int num)
{
	int sum=0;
	while(num)
	{
		sum+=num%10;
		num/=10;
	}
	return sum;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,ind=0;
	scanf("%d",&cnt);
	bool sp[50]={false};
	while(cnt--)
	{
		int temp;
		scanf("%d",&temp);
		temp=getsum(temp);
		if(sp[temp]==false)
		{
			sp[temp]=true;
			ind++;
		}
	}
	printf("%d\n",ind);
	bool ok=false;
	for(int i=0;i<50;i++)
		if(sp[i])
			if(ok==false)
				printf("%d",i),ok=true;
			else
				printf(" %d",i);
	putchar('\n');
	return EXIT_SUCCESS;
} 

so so so so easy。


1065单身狗

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int couple[1000000]={0};
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,sum=0;
	scanf("%d",&cnt);
	while(cnt--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		couple[a]=b+1;
		couple[b]=a+1;
	}
	scanf("%d",&cnt);
	while(cnt--)
	{
		int temp;
		scanf("%d",&temp);
		if(couple[temp]>0)
			couple[temp]=0;
		else
			couple[temp]=-1,sum++;
	}
	for(int i=0;i<=99999;i++)
		if(couple[i]>0&&couple[couple[i]-1]==0)
			couple[couple[i]-1]=-1,sum++;
	bool ok=false;
	printf("%d\n",sum);
	for(int i=0;i<=99999;i++)
		if(couple[i]==-1)
			if(ok==false)
				printf("%05d",i),ok=true;
			else
				printf(" %05d",i);
	return EXIT_SUCCESS;
}

微坑。一个单身狗都没有时,单身狗ID行应为空,所以不能在末尾加回车。


1066图像过滤

#include<stdio.h>
#include<stdlib.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int m,n,left,right,replace;
	scanf("%d%d%d%d%d",&m,&n,&left,&right,&replace);
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
		{
			int temp;
			scanf("%d",&temp);
			if(temp>=left&&temp<=right)
				temp=replace;
			printf("%03d%c",temp,j==n-1?'\n':' ');
		}
	return EXIT_SUCCESS;
}

so so so so easy。


1067试密码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt;
	char ans[25]={0};
	scanf("%s",ans);
	scanf("%d",&cnt);
	while(cnt)
	{
		char temp[250]={0};
		scanf("%*c%[^\n]",temp);
		if(temp[0]=='#'&&strlen(temp)==1)
			break;
		if(!strcmp(ans,temp))
		{
			printf("Welcome in\n");
			break;
		}
		printf("Wrong password: %s\n",temp);
		cnt--;
	}
	if(!cnt)
		printf("Account locked\n");
	return EXIT_SUCCESS;
}

坑。有几个需要注意的地方:1.用户尝试输入的密码大小不确定,稍微开大点;2.用户尝试输入的密码会包含空白字符;3.输入只有 ‘ # ’ 的时候退出……不能之判断第一个字符。


1068万绿丛中一点红

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int m,n,limit;
int matrix[1005][1005]={0};
bool check(int i,int j)
{
	const int move[8][2]={{-1,-1},{-1,0},{-1,1},{1,-1},{1,0},{1,1},{0,-1},{0,1}};
	for(int k=0;k<8;k++)
	{
		int tx=move[k][0]+i;
		int ty=move[k][1]+j;
		if(ty<0||ty>=n||tx<0||tx>=m)
			continue;
		if(abs(matrix[tx][ty]-matrix[i][j])<=limit)
			return false;
	}
	return true;
}
bool unique(int num,int x0,int y0)
{
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
		{
			if(i==x0&&j==y0)
				continue;
			if(matrix[i][j]==num)
				return false;
		}
	return true;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	scanf("%d%d%d",&n,&m,&limit);
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			scanf("%d",&matrix[i][j]);
	int sum=0,spi,spj;
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			if(check(i,j)&&unique(matrix[i][j],i,j))
				sum++,spi=i,spj=j;
	if(sum==0)
		printf("Not Exist\n");
	else if(sum>1)
		printf("Not Unique\n");
	else
		printf("(%d, %d): %d\n",spj+1,spi+1,matrix[spi][spj]);
	return EXIT_SUCCESS;
}

没有C++的map容器,又开不了那么大的数组,只能挨个确定唯一性,好在数据并不大。先确认差值符合再确定唯一性会快一些。


1069微博转发抽奖

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
//#define HOST
char queue[1005][25]={0};
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,jump,begin,sp=0;
	scanf("%d%d%d",&cnt,&jump,&begin);
	for(int i=1;i<=cnt;i++)
	{
		char temp[25]={0};
		scanf("%s",temp);
		if(i==begin)
		{
			bool go=false;
			for(int j=0;j<sp;j++)
				if(!strcmp(temp,queue[j]))
				{
					begin++;
					go=true;
					break;
				}
			if(go)
				continue;
			begin+=jump;
			printf("%s\n",temp);
			strcpy(queue[sp++],temp);
		}
	}
	if(!sp)
		printf("Keep going...\n");
	return EXIT_SUCCESS;
}

so easy。


1070结绳

#include<stdio.h>
#include<stdlib.h>
//#define HOST
int compare(const void *a,const void *b)
{
	return *(const int*)a-*(const int*)b;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt; 
	scanf("%d",&cnt);
	int array[10005]={0};
	for(int i=1;i<=cnt;i++)
		scanf("%d",&array[i]);
	qsort(array+1,cnt,sizeof(int),compare);
	double lenth=(double)array[1];
	for(int i=2;i<=cnt;i++)
		lenth=lenth/2.0+array[i]/2.0;
	printf("%d\n",(int)lenth);
	return EXIT_SUCCESS;
}

想要取到所有绳子的最大长度,要保证最长的绳子减半的次数最少。排序后计算便是。


1071小赌怡情

#include<stdio.h>
#include<stdlib.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int all,cnt;
	scanf("%d%d",&all,&cnt);
	while(cnt--)
	{
		int a,b,sp,push;
		scanf("%d%d%d%d",&a,&sp,&push,&b);
		if(push>all)
		{
			printf("Not enough tokens.  Total = %d.\n",all);
			continue;
		}
		if((!sp&&a>b)||(sp&&a<b))
		{
			all+=push;
			printf("Win %d!  Total = %d.\n",push,all);
		}
		if((sp&&a>b)||(!sp&&a<b))
		{
			all-=push;
			printf("Lose %d.  Total = %d.\n",push,all);
		}
		if(all<=0)
		{
			printf("Game Over.\n");
			break;
		}
	}
	return EXIT_SUCCESS;
}

so so easy。


1072开学寄语

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,items; 
	scanf("%d%d",&cnt,&items);
	bool item[10000]={false};
	while(items--)
	{
		int temp;
		scanf("%d",&temp);
		item[temp]=true;
	}
	int stu=0,goods=0;
	while(cnt--)
	{
		char name[10]={0};
		int index,book[10]={0},z=0;
		scanf("%s%d",name,&index);
		while(index--)
		{
			int temp;
			scanf("%d",&temp);
			if(item[temp])
			{
				book[z++]=temp;
				goods++;
			}
		}
		if(z)
		{
			stu++;
			printf("%s:",name);
			for(int i=0;i<z;i++)
				printf(" %04d",book[i]);
			putchar('\n');
		}
	}
	printf("%d %d\n",stu,goods);
	return EXIT_SUCCESS;
}

so so easy。


1073多选题常见计分法

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#define Max(a,b) (a>b?(a):(b))
//#define HOST
typedef struct
{
	int score;
	int anssum;
	int anscnt;
	bool ans[6];
}subject;
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt1,cnt2;
	scanf("%d%d",&cnt1,&cnt2);
	subject sp[105];
	for(int i=0;i<cnt2;i++)
	{
		scanf("%d%d%d",&sp[i].score,&sp[i].anssum,&sp[i].anscnt);
		for(int j=0;j<sp[i].anssum;j++)
			sp[i].ans[j]=false;
		for(int j=0;j<sp[i].anscnt;j++)
		{
			char temp;
			scanf("%*c%c",&temp);
			sp[i].ans[temp-'a']=true;
		}
	}
	int book[105][6]={0},bookmax=0;
	while(cnt1--)
	{
		double sum=0.0;
		for(int i=0;i<cnt2;i++)
		{
			while(getchar()!='(');
			int xuan;
			char xuanans[6]={0};
			bool zero=false;
			scanf("%d",&xuan);
			for(int j=0;j<sp[i].anssum;j++)
				if(sp[i].ans[j]==true)
					book[i][j]++;
			for(int j=0;j<xuan;j++)
			{
				char temp;
			 	scanf("%*c%c",&temp);
			 	if(sp[i].ans[temp-'a']==true)
			 		book[i][temp-'a']--;
				else
				{
					zero=true;
					book[i][temp-'a']++;
				}
			}
			getchar();
			if(xuan==sp[i].anscnt&&zero==false)
				sum+=(double)sp[i].score;
			else if(xuan!=sp[i].anscnt&&zero==false)
				sum+=(double)sp[i].score/2.0;
		}
		printf("%.1lf\n",sum);
	}
	for(int i=0;i<cnt2;i++)
		for(int j=0;j<6;j++)
			bookmax=Max(bookmax,book[i][j]);
	if(!bookmax)
		printf("Too simple\n");
	else
	{
		for(int i=0;i<cnt2;i++)
			for(int j=0;j<6;j++)
				if(book[i][j]==bookmax)
					printf("%d %d-%c\n",bookmax,i+1,j+'a');
	}
	return EXIT_SUCCESS;
} 

一道很麻烦的模拟题,由 1058 改编而成。需注意错题不单单是错误的选项,对的选项没选也算错误。


1074宇宙无敌加法器

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	char biao[20]={0};
	char biga[20]={0};
	char bigb[20]={0};
	char ans[50]={0};
	scanf("%s%s%s",biao,biga,bigb);
	int lenbiao=strlen(biao),lena=strlen(biga),lenb=strlen(bigb);
	int index=0;
	while(index<lena||index<lenb)
	{
		int a,b,c;
		if(index>=lena)
			a=0;
		else
			a=biga[lena-index-1]-'0';
		if(index>=lenb)
			b=0;
		else
			b=bigb[lenb-index-1]-'0';
		if(biao[lenbiao-index-1]=='0')
			c=10;
		else
			c=biao[lenbiao-index-1]-'0';
		ans[index]+=a+b;
		if(ans[index]>=c)
		{
			ans[index]-=c;
			ans[index+1]++;
		}
		ans[index++]+='0';
	}
	if(ans[index])
		ans[index]+='0';
	else
		index--;
	while(ans[index]=='0')
		index--;
	for(int i=index;i>=0;i--)
		putchar(ans[i]);
	if(index<0)
		putchar('0'); 
	putchar('\n');
	return EXIT_SUCCESS;
}

小坑。结果是 0 的时候确保输出一个 0 。


1075链表元素分类

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
struct
{
	int data,next;
}node[100005];
int arr[100005][3]={0};
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int st,n,k,ip;
	scanf("%d%d%d",&st,&n,&k);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&ip);
		scanf("%d%d",&node[ip].data,&node[ip].next);
	}
	int point=st,index[3]={0};
	while(point!=-1)
	{
		int data=node[point].data;
		if(data<0)
			arr[index[0]++][0]=point;
		else if(data>=0&&data<=k)
			arr[index[1]++][1]=point;
		else
			arr[index[2]++][2]=point;
		point=node[point].next;
	}
	bool fb=true;
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<index[i];j++)
		{
			if(fb)
			{
				printf("%05d %d ",arr[j][i],node[arr[j][i]].data);
				fb=false;
			}
			else
				printf("%05d\n%05d %d ",arr[j][i],arr[j][i],node[arr[j][i]].data); 
		}
	}
	printf("-1");
	return EXIT_SUCCESS;
}

存储链表后,从链表头开始遍历依次存下 <0、0<=&&<=k、>k 的地址。

按上面的顺序依次输出地址和数据。


1076Wifi密码

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(int argc,char **argv)
{
	int cnt,ins;
	scanf("%d",&cnt);
	int ans[105]={0};
	for(ins=0;ins<cnt;ins++)
	{
		char alpha,is='F';
		while(is!='T')
			scanf("%*c%c-%c",&alpha,&is);
		ans[ins]=alpha-'A'+1;
	}
	for(cnt=0;cnt<ins;cnt++)
		putchar('0'+ans[cnt]);
	putchar('\n');
	return EXIT_SUCCESS;
 } 

so so so easy。


1077互评成绩计算

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Max(a,b) (a<b?(b):(a))
#define Min(a,b) (a<b?(a):(b))
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,maxs;
	scanf("%d%d",&cnt,&maxs);
	for(int i=1;i<=cnt;i++)
	{
		int teacher,max=0,min=1<<30,sum=0,div=cnt-3;
		scanf("%d",&teacher);
		for(int j=1;j<cnt;j++)
		{
			int temp;
			scanf("%d",&temp);
			if(temp<0||temp>maxs)
			{
				div--;
				continue;
			}
			sum+=temp;
			max=Max(max,temp);
			min=Min(min,temp);
		}
		sum-=max;
		sum-=min;
		sum=(int)round(((double)sum/div+(double)teacher)/2.0);
		printf("%d\n",sum);
	}
	return EXIT_SUCCESS;
}

so so so easy。


1078字符串压缩与解压

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<ctype.h>
//#define HOST
void ya(char *str)
{
	int i=0,len=strlen(str),nowlen=0;
	char sp=str[0];
	while(i<len)
	{
		if(sp==str[i])
		{
			nowlen++;
		}
		else
		{
			if(nowlen>1)
				printf("%d",nowlen);
			putchar(sp);
			nowlen=1;
			sp=str[i];
		}
		i++;
	}
	if(nowlen>1)
		printf("%d",nowlen);
	putchar(sp);
	return;
}
void jie(char *str)
{
	int i=0,len=strlen(str);
	char sp,temp;
	while(i<len)
	{
		sp=str[i];
		if(isdigit(sp))
		{
			i++;
			int num=sp-'0';
			while(isdigit(str[i]))
			{
				num=num*10+str[i]-'0';
				i++;
			}
			temp=str[i];
			for(int k=1;k<=num;k++)
				putchar(temp);
		}
		else
			putchar(sp);
		i++;
	}
	return;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	char ch,str[1005]={0};
	ch=getchar();
	scanf("%*c%[^\n]%*c",str);
	if(ch=='C')
		ya(str);
	else
		jie(str);
	putchar('\n');
	return EXIT_SUCCESS;
}

so so easy。上学期ACM校赛的一个签到题。


1079延迟的回文数

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
//#define HOST
bool check(char *num)
{
	int left=0,right=strlen(num)-1;
	while(left<right)
	{
		if(num[left]!=num[right])
			return false;
		left++;
		right--;
	}
	return true;
}
char* transform(char *num)
{
	static char spnum[1200]={0};
	int left=0,right=strlen(num)-1,index=0;
	for(int i=right;i>=left;i--)
		spnum[index++]=num[i];
	return spnum;
}
char* Bigadd(char *num1,char *num2)
{
	int len=strlen(num1),i,j;
	static char sumnum[1200]={0};
	memset(sumnum,0,sizeof(sumnum));
	for(i=len;i>0;i--)
	{
		sumnum[i]+=num1[i-1]+num2[i-1]-2*'0';
		if(sumnum[i]>=10)
		{
			sumnum[i-1]++;
			sumnum[i]-=10;
		}
	}
	if(sumnum[0])
		i=1;
	for(j=0;j<=len;j++)
		sumnum[j]+='0';
	sumnum[j]=0;
	//printf(">>>%s %d\n",sumnum,i);
	if(!i)
		return (sumnum+1);
	return sumnum;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt=10;
	char num[1200]={0};
	scanf("%s",num);
	if(check(num))
		printf("%s is a palindromic number.\n",num);
	else
	{	
		while(cnt--)
		{
			char *temp1=transform(num);	
			char *temp2=Bigadd(num,temp1);
			printf("%s + %s = %s\n",num,temp1,temp2);
			strcpy(num,temp2);
			if(check(temp2))
				break;
		}
		if(cnt>-1)
			printf("%s is a palindromic number.\n",num);
		else
			printf("Not found in 10 iterations.\n");
	}
	return EXIT_SUCCESS;
}

大整数高精度运算这块总是写的很麻烦。。重复的翻转总怕出错。


1080MOOC期终成绩

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<math.h>
//#define HOST
typedef struct
{
	char name[25];
	int sum,gp,gm,gf;
}student;
typedef struct
{
	char name[25];
	int gnum;
}studentcopy;
student sp[10005]={0};
studentcopy sp2[10005]={0},sp3[10005]={0};
void getsp(int cnt1,int cnt2,int cnt3)
{
	int ks=0,ls=0;
	for(int i=0;i<cnt1;i++)
	{
		while(strcmp(sp[i].name,sp2[ks].name)>0&&ks<cnt2)
			ks++;
		while(strcmp(sp[i].name,sp3[ls].name)>0&&ls<cnt3)
			ls++;
		sp[i].gm=-1;
		if(strcmp(sp[i].name,sp2[ks].name)==0)
			sp[i].gm=sp2[ks].gnum;
		if(strcmp(sp[i].name,sp3[ls].name)==0)
			sp[i].gf=sp3[ls].gnum;
		if(sp[i].gm>sp[i].gf)
			sp[i].sum=(int)round(0.4*sp[i].gm+0.6*sp[i].gf);
		else
			sp[i].sum=sp[i].gf;
	}
}
int compare(const void *a,const void *b)
{
	const student *sa=(const student*)a;
	const student *sb=(const student*)b;
	if(sa->sum==sb->sum)
		return strcmp(sa->name,sb->name);
	return sb->sum-sa->sum;
}
int comforsp(const void *a,const void *b)
{
	const student *sa=(const student*)a;
	const student *sb=(const student*)b;
	return strcmp(sa->name,sb->name);
}
int comforcopy(const void *a,const void *b)
{
	const studentcopy *sa=(const studentcopy*)a;
	const studentcopy *sb=(const studentcopy*)b;
	return strcmp(sa->name,sb->name);
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt1,cnt2,cnt3;
	scanf("%d%d%d",&cnt1,&cnt2,&cnt3);
	char str[25]={0};
	int index1=0,index2=0,index3=0;
	while(cnt1--)
	{
		int temp;
		scanf("%s%d",sp[index1].name,&temp);
		if(temp>=200)
			sp[index1++].gp=temp;
	}
	while(cnt2--)
	{
		scanf("%s%d",sp2[index2].name,&sp2[index2].gnum);
		index2++;
	}
	while(cnt3--)
	{
		scanf("%s%d",sp3[index3].name,&sp3[index3].gnum);
		index3++;
	}
	qsort(sp,index1,sizeof(student),comforsp);
	qsort(sp2,index2,sizeof(studentcopy),comforcopy);
	qsort(sp3,index3,sizeof(studentcopy),comforcopy);
	getsp(index1,index2,index3);
	qsort(sp,index1,sizeof(student),compare);
	for(int i=0;i<index1;i++)
	{
		if(sp[i].sum>=60)
		{
			printf("%s",sp[i].name);
			printf(" %d",sp[i].gp);
			if(sp[i].gm!=-1)
				printf(" %d",sp[i].gm);
			else
				printf(" -1");
			printf(" %d",sp[i].gf);
			printf(" %d\n",sp[i].sum);
		}
	}
	return EXIT_SUCCESS;
}

坑坑坑坑坑坑坑坑坑坑!!!坑到爆炸!

纯C处理这种大规模可重复数据真的是太麻烦了,直接线性搜索名称最后一个测试点稳稳地超时。

解决方法是多开两个结构体数组用来存储期中、期末考试成绩,以 >=200分 的上机成绩作为参考,排序三个成绩的名称后,按顺序补全作为结果的结构体数组中的期中、期末成绩。

我的想法是找到同名的就把成绩复制过去,没成绩的就是 0 ,最后输出的时候过滤总成绩 <60 分的,期中考试是 0 的输出 -1 就是了。

结果。。最后一个测试点一直是WA??折腾了老一番,怎么改都不对。。

吃了顿饭冷静了下,发现期中考试会有家伙参加考试,然后考了个 0 分的。。。

2333,长教训了,算是自己逻辑不周吧。。

另>>:做出来竟然比用STL库 map 快。


1081检查密码

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
int main(int argc,char **argv)
{
	int cnt,inx;
	scanf("%d",&cnt);
	while(cnt--)
	{
		char str[100]={0};
		scanf("%*c%[^\n]",str);
		if(strlen(str)<6)
		{
			printf("Your password is tai duan le.\n");
			continue;
		}
		int h1=0,h2=0,flag=0;
		for(inx=0;inx<strlen(str);inx++)
		{
			if(!(isalnum(str[inx])||str[inx]=='.'))
			{
				printf("Your password is tai luan le.\n");
				flag=1;break;
			}
			if(isalpha(str[inx]))
				h1=1;
			if(isdigit(str[inx]))
				h2=1;		
		}
		if(flag)
			continue;
		if(h1==0&&h2==1)
			printf("Your password needs zi mu.\n");
		if(h2==0&&h1==1)
			printf("Your password needs shu zi.\n");
		if(h1==1&&h2==1)
			printf("Your password is wan mei.\n");
	}
	return EXIT_SUCCESS;
} 

小坑,密码串可能有空格。


1082射击比赛

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt; 
	scanf("%d",&cnt);
	int bestID,worseID,bs=INT32_MAX,ws=0;
	while(cnt--)
	{
		int temp,x,y;
		scanf("%d%d%d",&temp,&x,&y);
		x=x*x+y*y;
		if(x>ws)
		{
			ws=x;
			worseID=temp;
		}
		if(x<bs)
		{
			bs=x;
			bestID=temp;
		}
	} 
	printf("%04d %04d\n",bestID,worseID); 
	return EXIT_SUCCESS;
} 

so so so so easy。


1083是否存在相等的差

#include<stdio.h>
#include<stdlib.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,arr[10005]={0}; 
	scanf("%d",&cnt);
	for(int i=1;i<=cnt;i++)
	{
		int temp;
		scanf("%d",&temp);
		arr[abs(temp-i)]++;
	}
	for(int i=10000;i>=0;i--)
		if(arr[i]>1)
			printf("%d %d\n",i,arr[i]);
	return EXIT_SUCCESS;
}

so so so so easy。


1084外观数列

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#define HOST
char* tran(char* arr,int len)
{
	static char q[100000]={0};
	memset(q,0,sizeof(q));
	int index=0,isp=0,sp=0,take=arr[0];
	while(index<len)
	{
		if(take==arr[index])
			sp++;
		else
		{
			q[isp++]=take;
			int left=isp,right=isp-1;
			while(sp)
			{
				q[isp++]=sp%10+'0';
				sp/=10;
				right++;
			}
			while(left<right)
			{
				int temp=q[left];
				q[left]=q[right];
				q[right]=temp;
				left++,right--;
			}
			take=arr[index];
			sp=1;
		}
		index++;
	}
	q[isp++]=take;
	int left=isp,right=isp-1;
	while(sp)
	{
		q[isp++]=sp%10+'0';
		sp/=10;
		right++;		
	}
	while(left<right)
	{
		int temp=q[left];
		q[left]=q[right];
		q[right]=temp;
		left++,right--;
	}
	return q;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,k;
	char array[100000]={0};
	scanf("%d%d",&cnt,&k);
	array[0]=cnt+'0';
	for(int i=1;i<k;i++)
	{
		char *point=tran(array,strlen(array)); 
		strcpy(array,point); 
		//printf("%d>>%s\n",i+1,array);
	}
	printf("%s\n",array); 
	return EXIT_SUCCESS;
}

不能小看 N 最大只有 40 ,d=2 N=40 的时候,上万位都打不住。


1085PAT单位排行

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
//#define HOST
typedef struct
{
	char isp;
	double score;
	char name[20];
	int stnum,iscore;
}unit;
unit sp[100005]={0},ans[100005]={0};
int namecompare(const void *a,const void *b)
{
	const unit *sa=(const unit*)a;
	const unit *sb=(const unit*)b;
	return strcmp(sa->name,sb->name);
}
int anscompare(const void *a,const void *b)
{
	const unit *sa=(const unit*)a;
	const unit *sb=(const unit*)b;
	if(sa->iscore==sb->iscore)
	{
		if(sa->stnum==sb->stnum)
			return strcmp(sa->name,sb->name);
		return sa->stnum-sb->stnum;
	}
	return sb->iscore-sa->iscore;
}
void ges(char mode,double *to,double *from)
{
	if(mode=='T')
		*to+=*from*1.5;
	if(mode=='A')
		*to+=*from;
	if(mode=='B')
		*to+=*from/1.5;
	return;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,index=0; 
	scanf("%d",&cnt);
	while(cnt--)
	{
		char ch,temp[10]={0};
		while((ch=getchar())=='\n');
		sp[index].isp=ch;
		scanf("%*s");
		scanf("%lf",&sp[index].score);
		scanf("%s",temp);
		for(int i=0;i<strlen(temp);i++)
			temp[i]=tolower(temp[i]);
		strcpy(sp[index].name,temp);
		index++;
	}
	qsort(sp,index,sizeof(unit),namecompare);
	int ind=0,jnd=0;
	while(jnd<index)
	{
		strcpy(ans[ind].name,sp[jnd].name);
		ans[ind].stnum=1;
		ges(sp[jnd].isp,&ans[ind].score,&sp[jnd].score);
		ind++,jnd++;
		int cut=1;
		while(jnd<index&&(!strcmp(ans[ind-cut].name,sp[jnd].name)))
		{
			ans[ind-cut].stnum++;
			ges(sp[jnd].isp,&ans[ind-cut].score,&sp[jnd].score);
			jnd++;
			if(jnd>=index)
				break;
		}
		ans[ind-1].iscore=(int)floor(ans[ind-1].score);
	}
	qsort(ans,ind,sizeof(unit),anscompare);
	int qt=0,diff=-1,qr=1;
	printf("%d\n",ind);
	for(int i=0;i<ind;i++)
	{
		if(diff!=ans[i].iscore)
		{
			diff=ans[i].iscore;	
			qt+=qr;
			qr=1;
		}
		else
			qr++;
		printf("%d %s %d %d\n",qt,ans[i].name,ans[i].iscore,ans[i].stnum);
	}
	return EXIT_SUCCESS;
}

C语言鸡肋的时候到了,什么辅助数据结构也没有,只能用结构体数组从头构建。处理加权分数的时候最后转成整形变量,后面的排序输出会方便很多,还不会出莫名其妙的错误。


1086就不告诉你

#include<stdio.h>
#include<stdlib.h>
//#define HOST
void print(int num)
{
	while(num%10==0)
		num/=10;
	while(num)
	{
		putchar(num%10+'0');
		num/=10;
	}
	putchar('\n');
	return;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int a,b;
	scanf("%d%d",&a,&b);
	print(a*b); 
	return EXIT_SUCCESS;
}

so so so so easy。


1087有多少不同的值

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,sum=0;
	int book[10400]={false};
	scanf("%d",&cnt);
	for(int i=1;i<=cnt;i++)
	{
		int index=i/2+i/3+i/5;
		if(book[index]==false)
		{
			sum++;
			book[index]=true;
		}
	}
	printf("%d\n",sum); 
	return EXIT_SUCCESS;
}

so so so so easy。


1088三人行

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int my,x,y;
	scanf("%d%d%d",&my,&x,&y);
	for(int jia=99;jia>=10;jia--)
	{
		int yi=jia%10*10+jia/10;
		double bing=(double)yi/(double)y;
		if(fabs(bing-(fabs((double)jia-(double)yi))/x)<1e-6)
		{
			printf("%d",jia);
			if(jia>my)printf(" Cong");
			if(jia==my)printf(" Ping");
			if(jia<my)printf(" Gai");
			if(yi>my)printf(" Cong");
			if(yi==my)printf(" Ping");
			if(yi<my)printf(" Gai");
			if(bing>my)printf(" Cong\n");
			if(bing==my)printf(" Ping\n");
			if(bing<my)printf(" Gai\n");
			return EXIT_SUCCESS;	
		}
	}
	printf("No Solution\n");
	return EXIT_SUCCESS;
}

so easy。


1089狼人杀-简单版

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,index,book[105]={0},sp[105]={0},ans[105];
	bool get=true;
    scanf("%d",&cnt);
    for(int i=1;i<=cnt;i++)
    	scanf("%d",&book[i]);
    for(int i=1;i<cnt;i++)
    {
    	for(int j=i+1;j<=cnt;j++)
    	{
    		memset(sp,0,sizeof(sp));
    		sp[i]=sp[j]=-1;
    		ans[0]=ans[1]=0;
    		index=0;
    		for(int k=1;k<=cnt;k++)
    		{
    			if((sp[abs(book[k])]==0&&book[k]<0)||(sp[book[k]]==-1&&book[k]>0))
    				ans[index++]=k;
			}
			if(index==2&&(sp[ans[0]]==0&&sp[ans[1]]==-1||sp[ans[1]]==0&&sp[ans[0]]==-1))
			{
				printf("%d %d\n",i,j);
				get=false;
				break;
			}
		}
		if(get==false)
			break;
	}
	if(get)
		printf("No Solution\n");
	return EXIT_SUCCESS;
}

枚举法。先尝试了下枚举撒谎的,发现很难判断是否正确的说出了狼人是哪两个,折腾半天失败告终…555…555…

枚举狼人就很简单了,谁说得和预设狼人不符,那么说的就是假话。再判断下是不是只有一个狼人说了假话就是了。


1090危险品装箱

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int sp[100000][105]={0};
int main(int argc,char **argv)
{
	int cnt1,cnt2;
	scanf("%d%d",&cnt1,&cnt2);
	while(cnt1--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		sp[a][sp[a][0]+1]=b;
		sp[a][0]++;
	}
	while(cnt2--)
	{
		bool book[100000]={false};
		int array[10001]={0};
		int cnt,pass=0;
		scanf("%d",&cnt);
		int num=0;
		while(cnt--)
		{
			scanf("%d",&array[num]);
			for(int index=1;index<=sp[array[num]][0];index++)
				book[sp[array[num]][index]]=true;
			num++;
		}
		for(int i=0;i<num;i++)
			if(book[array[i]])
				pass=1;
		if(pass)
			printf("No\n");
		else
			printf("Yes\n");
	}
	return EXIT_SUCCESS;
}

用二维数组先存储每个编号对应的若干个编号,sp[编号][0]存储总共对应着几个。

用布尔数组统计每个输入的所有不相容编号,之后查询如果有矛盾输出No,否则Yes。

看了看其他人做的,大多用的STL容器,自己对STL库的掌握还需要努力啊……


>>以下5题为2018/12/09PAT参赛时所写


1091N-自守数

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<math.h>
bool check(long long a,int b)
{
	int ts=0;
	if(b/10==0)
		ts=1;
	else if(b/100==0)
		ts=2;
	else
		ts=3;
	int isp=a%(int)pow(10,ts);
	if(isp==b)
		return true;
	return false;
}
int main(int argc,char **argv)
{
	//freopen("test.txt","r",stdin);
	int cnt;
	scanf("%d",&cnt);
	while(cnt--)
	{
		int temp;
		bool jump=false;
		scanf("%d",&temp);
		int i,j;
		for(i=1;i<10;i++)
		{
			long long sp=(long long)i*temp*temp;
			if(check(sp,temp))
			{
				printf("%d %lld\n",i,sp);
				break;
			}
		}
		if(i==10)
			printf("No\n");
	}
	return EXIT_SUCCESS;
}

so easy

1092最好吃的月饼

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int mat[1005]={0};
int max[1005]={0};
int maxmoon=0;
int main(int argc, char *argv[])
{
	int cnt,city,sp=0;
	scanf("%d%d",&cnt,&city);
	int is,js,i;
	for(is=1;is<=city;is++)
	{
		for(js=1;js<=cnt;js++)
		{
			if(is==1)
				scanf("%d",&mat[js]);
			else
			{
				int temp;
				scanf("%d",&temp);
				mat[js]+=temp;
			}
		}
	}
	for(js=1;js<=cnt;js++)
	{
		if(mat[js]>maxmoon)
		{
			maxmoon=mat[js];
			sp=0;
			max[sp++]=js;
		}
		else if(mat[js]==maxmoon)
		{
			max[sp++]=js;
		}
	}
	printf("%d\n",maxmoon);
	for(i=0;i<sp;i++)
		printf("%d%c",max[i],i==sp-1?'\n':' ');
	return 0;
}

统计每个城市的和,取最大值遍历。

1093字符串A+B

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
char str1[1000005]={0};
short int sp[128]={0};
char str2[1000005]={0};
int main(int argc, char *argv[])
{
	//freopen("test.txt","r",stdin);
	scanf("%[^\n]%*c",str1);
	scanf("%[^\n]%*c",str2);
	int i;
	for(i=0;i<strlen(str1);i++)
	{
		int temp=str1[i];
		if(sp[temp]==0)
			sp[temp]=1;
		else if(sp[temp]==1)
			sp[temp]=2;
	}
	for(i=0;i<strlen(str2);i++)
	{
		int temp=str2[i];
		if(sp[temp]==0)
			sp[temp]=1;
		else if(sp[temp]==1)
			sp[temp]=2;
	}
	for(i=0;i<strlen(str1);i++)
	{
		int temp=str1[i];
		if(sp[temp]!=10)
		{
			putchar(str1[i]);
			if(sp[temp]==2)
				sp[temp]=10;
		}
	}
	for(i=0;i<strlen(str2);i++)
	{
		int temp=str2[i];
		if(sp[temp]!=10)
		{
			putchar(str2[i]);
			if(sp[temp]==2)
				sp[temp]=10;
		}
	}
	putchar('\n');
	return 0;
}

考试时写的有点儿乱,循环里的变量都定义在了外面,怕不支持C99。

统计出现两次的字符,这些字符只能打印一次。

1094谷歌的招聘

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<math.h>
int  check(int num)
{
	int i;
	if(num<2)
		return false;
	for(i=2;i<=(int)sqrt(num);i++)
	{
		if(num%i==0)
			return false;
	}
	return true;
}
int getff(int num)
{
	int i=0;
	while(num)
	{
		num/=10;
		i++;
	}
	return i;
}
int main(int argc,char **argv)
{
	//freopen("test.txt","r",stdin);
	int len,cnt;
	scanf("%d%d",&len,&cnt);
	char number[1005]={0};
	scanf("%s",number);
	int i,j;
	for(i=0;i<=len-cnt;i++)
	{
		int temp=0;;
		for(j=0;j<cnt;j++)
		{
			temp*=10;
			temp+=number[i+j]-'0';
		}
		if(check(temp))
		{
			int k;
			for(k=1;k<=cnt-getff(temp);k++)
				printf("0");
			printf("%d\n",temp);
			break;
		}
	}
	if(i==len-cnt+1)
		printf("404\n");
	return EXIT_SUCCESS;
}

挨个取数字判断是否为素数即可。

小坑,不要忘了题目中说的保留前导零。

1095解码PAT准考证

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
typedef struct
{
	char rank;
	int kid;
	int date;
	int mid;
	int score;
}student;
student sp[10005]={0};
int compare(const void *a,const void *b)
{
	const student *sa=(const student*)a;
	const student *sb=(const student*)b;
	if(sa->score==sb->score)
	{
		if(sa->rank==sb->rank)
		{
			if(sa->kid==sb->kid)
			{
				if(sa->date==sb->date)
				{
					return sa->mid-sb->mid;
				}
				return sa->date-sb->date;
			}
			return sa->kid-sb->kid;
		}
		return sa->rank-sb->rank;
	}
	return sb->score-sa->score;
}
int main(int argc, char *argv[])
{
	//freopen("test.txt","r",stdin);
	int N,M;
	scanf("%d%d",&N,&M);
	int i;
	for(i=0;i<N;i++)
	{
		char temp[20]={0};
		scanf("%s",temp);
		sscanf(temp,"%c%3d%6d%d",&sp[i].rank,&sp[i].kid,&sp[i].date,&sp[i].mid);
		scanf("%d",&sp[i].score);
	}
	qsort(sp,N,sizeof(student),compare);
	int j;
	for(j=1;j<=M;j++)
	{
		int number,temp;
		char ctemp;
		scanf("%d",&number);
		switch(number)
		{
			case 1:
				while((ctemp=getchar())==' ');
				printf("Case %d: %d %c\n",j,number,ctemp);
				{
					int i;
					bool isq=false;
					for(i=0;i<N;i++)
					{
						if(sp[i].rank==ctemp)
						{
							printf("%c%03d%06d%03d %d\n",sp[i].rank,sp[i].kid,sp[i].date,sp[i].mid,sp[i].score);
							isq=true;							
						}
					}
					if(isq==false)
						printf("NA\n");
				}
				break;
			case 2:
				scanf("%d",&temp);
				printf("Case %d: %d %03d\n",j,number,temp);
				{
					int i,sumstu=0,sumscore=0;
					for(i=0;i<N;i++)
					{
						if(sp[i].kid==temp)
						{
							sumstu++;
							sumscore+=sp[i].score;
						}
					}
					if(!sumstu)
						printf("NA\n");
					else
						printf("%d %d\n",sumstu,sumscore);
				}
				break;
			case 3:
				scanf("%d",&temp);
				printf("Case %d: %d %06d\n",j,number,temp);
				{
					int i,ksp[1000]={0},max=0;
					bool isha=false;
					for(i=0;i<N;i++)
					{
						if(sp[i].date==temp)
						{
							isha=true;
							ksp[sp[i].kid]++;
							if(ksp[sp[i].kid]>max)
								max=ksp[sp[i].kid];
						}
					}
					for(i=max;i>0;i--)
					{
						int j;
						for(j=101;j<=999;j++)
							if(ksp[j]==i)
							{
								printf("%d %d\n",j,i);
							}
					}
					if(isha==false)
						printf("NA\n");
				}
				break;
			default:
				break;
		}
	}
	return 0;
}

这次考试最麻烦的一道题,要求很多。

每个指令没输出都要输出NA,所有前导零都不可省略。其他的正常来就是了。


END

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写) 的相关文章

  • PAT A1153

    题目 xff1a https pintia cn problem sets 994805342720868352 problems 1071785190929788928 这道题我很久才AC xff0c 主要是不知道原来它的输入可以乱来 我
  • PAT乙级1037 在霍格沃茨找零钱 (20分)

    pragma warning disable 4996 include
  • B1094 谷歌的招聘 (20 分)

    2004 年 7 月 谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌 如下图 用于招聘 内容超级简单 就是一个以 com 结尾的网址 而前面的网址是一个 10 位素数 这个素数是自然常数 e 中最早出现的 10 位连续数字 能找出这个
  • PAT 1054 求平均值 python

    1054 求平均值 20 分 本题的基本要求非常简单 给定 N 个实数 计算它们的平均值 但复杂的是有些输入数据可能是非法的 一个 合法 的输入是 1000 1000 区间内的实数 并且最多精确到小数点后 2 位 当你计算平均值的时候 不能
  • 【PAT】1033 旧键盘打字 (20 分)

    1033 旧键盘打字 20 分 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中
  • 分支-20. 计算符号函数的值(10)

    对于任一整数n 符号函数sign n 的定义如下 请编写程序计算该函数对任一输入整数的值 输入格式 输入在一行中给出整数n 输出格式 在一行中按照格式 sign n 函数值 输出该整数n对应的函数值 输入样例 1 10 输出样例 1 sig
  • 1031. 查验身份证(15)

    一个合法的身份证号码由17位地区 日期编号和顺序编号加1位校验码组成 校验码的计算规则如下 首先对前17位数字加权求和 权重分配为 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 然后将计算的和对11取模得到值Z 最
  • PAT乙级1074. 宇宙无敌加法器(C语言)

    PAT乙级真题题解目录 可回顾 1048 数字加密 都涉及使数字位数一致 1 不同位数的PAT数之间如何方便相加 构造相同大小的字符数组 按位数存储对应的数字 2 相加时转为数字进行运算 3 结果为0 为特殊情况 单独写输出代码 inclu
  • PAT : 基础编程题目集_编程题答案(7-1 ~ 7-38)(纯C编写)

    题目地址 7 1 include
  • 1041. 考试座位号(15)

    每个PAT考生在参加考试时都会被分配两个座位号 一个是试机座位 一个是考试座位 正常情况下 考生在入场时先得到试机座位号码 入座进入试机状态后 系统会显示该考生的考试座位号码 考试时考生需要换到考试座位就座 但有些考生迟到了 试机已经结束
  • PAT 1103 Integer Factorization

    题目的意思是给定n k p 求是否存在k个正整数 每个数的p次幂相加的结果等于n 有 输出k个数相加的结果最大的那个 如果有多个 输出序列从大到小排最大的那个 从左往右比较 若 i lt l a i
  • PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)

    题目集地址 报名了12月的PAT B 先试试水 已完成 2018 10 22 2018 11 14 更新 2018 12 09 PAT乙级考试100分 考试代码已更新 冬天坐火车跑去考试冻懵了 来年对战PAT甲级考试 目录 目录 题目集地址
  • 【PAT甲级A1125】 Chain the Ropes (25分)(c++)

    1125 Chain the Ropes 25分 作者 CHEN Yue 单位 浙江大学 代码长度限制 16 KB 时间限制 200 ms 内存限制 64 MB Given some segments of rope you are sup
  • PAT 1018 锤子剪刀布 (20分)

    1018 锤子剪刀布 20分 大家应该都会玩 锤子剪刀布 的游戏 两人同时给出手势 胜负规则如图所示 现给出两人的交锋记录 请统计双方的胜 平 负次数 并且给出双方分别出什么手势的胜算最大 输入格式 输入第 1 行给出正整数 N 10 5
  • 1033 旧键盘打字 (20分)

    这道题很坑的一点就是 有可能坏掉的键盘是空串 所有的键都是好的 如下测试用例 input NULL abcdefg output abcdefg 所以 用字符串数组的不能直接用scanf s str 读入 用string的也不能直接用cin
  • 1063. 计算谱半径(20)

    在数学中 矩阵的 谱半径 是指其特征值的模集合的上确界 换言之 对于给定的n个复数空间的特征值 a1 b1i an bni 它们的模为实部与虚部的平方和的开方 而 谱半径 就是最大模 现在给定一些复数空间的特征值 请你计算并输出这些特征值的
  • 【PAT乙级】旧键盘打字

    题目描述 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中对应英文字母的坏键以大
  • 1055. 集体照 (25) PAT乙级真题

    1055 集体照 25 拍集体照时队形很重要 这里对给定的N个人K排的队形设计排队规则如下 每排人数为N K 向下取整 多出来的人全部站在最后一排 后排所有人的个子都不比前排任何人矮 每排中最高者站中间 中间位置为m 2 1 其中m为该排人
  • pat 乙级 1015. 德才论 (25) c++

    http 39 106 25 239 个人网站 欢迎访问 交流 1015 德才论 25 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN Li 宋代史学家司马光在 资
  • ts 流基础(白话讲解).

    author hjjdebug date 2022年 09月 27日 星期二 ts 流就是188个字节构成的流数据 先来点最简单的 ts 头部 4字节 ts 流是47开头的 以188字节为单位的打包流 由4字节包头及包体构成 4字节第一个4

随机推荐

  • 坐标变换

    根据线性代数32页 编写的 任意1点坐标绕某一点坐标逆时针旋转degree度 可用公式 x x1 cos degree y1 sin degree y x1 sin degree y1 sin degree 很方便 include
  • 解决ChatGLM-6B的微调算法P-tuning v2运行train.sh出错

    运行清华大学开源的ChatGLM 6B及其微调算法P tuning v2 根据其官方提供的步骤 在配置好环境后Run gt gt bash train sh gt gt 报错如下 Traceback most recent call las
  • c++中的堆和栈

    在 C 中 内存的使用主要分为两种类型 栈内存和堆内存 栈 Stack 内存 栈内存用于存储局部变量和函数参数 函数内部创建的变量通常都在栈上 例如 如果你在函数中声明一个整数或一个对象 那么这个整数或对象将在栈上创建 栈上的内存由编译器自
  • 系统默认编码的配置(转)

    运行locale指令得到当前系统编码设置的详细资料 一 locale的五脏六腑 1 语言符号及其分类 LC CTYPE 2 数字 LC NUMERIC 3 比较和排序习惯 LC COLLATE 4 时间显示格式 LC TIME 5 货币单位
  • java开发用amd处理器,为什么我的Java应用程序在AMD处理器上速度更快?

    I made the observation that my java application is running much faster when executed on an AMD processor in contrast to
  • java学习之_Spring框架01_IoC控制反转和DI依赖注入

    spring架构 Spring 最初的目标就是要整合一切优秀资源 然后对外提供一个统一的服务 Spring 模块构建在核心容器之上 核心容器定义了创建 配置和管理 bean 的方式 bean可以看成是一个黑盒子 即只需要知道其功能而不必知道
  • CustomEditor CustomPropertyDrawer

    CustomEditor typeof Type 这是所有写过编辑器的人非常熟悉的一行代码 因为它是编辑器的入口 但是 CustomPropertyDrawer typeof Type 恐怕就没几个人知道了 它和CustomEditor功能
  • 如何分析FPGA的片上资源使用情况

    如何分析FPGA的片上资源使用情况 在维护遗留代码 4 时序问题初露端倪这篇文章中 我提到 第三方开发的设计中 组合逻辑与时序逻辑的比例为2 6 1 这是造成该设计时序收敛困难的原因之一 mengyudn朋友很热心 对这个数据的来历产生了疑
  • 神经网络笔记

    神经网络 一 什么是神经网络 是基于生物学中神经网络的基本原理 在理解和抽象了人脑结构和外界刺激响应机制后 以网络拓扑知识为理论基础 模拟人脑的神经系统对复杂信息的处理机制的一种数学模型 二 神经网络的基本特性 1 非线性 非线性关系是自然
  • jsp自定义标签库

    标签的概念 标签 标签是一种XML元素 通过标签可以使JSP网页变得简洁并且易于维护 还可以方便地实现同一个JSP文件支持多种语言版本 由于标签是XML元素 所以它的名称和属性都是大小写敏感的 标签处理类 标签处理类似是Java类 这个类继
  • 绘图工具(代码实现绘图)---plantuml

    基础入门第一个例子 时序图 流程图 源代码 图片展示 还有很多这里不再介绍 最近看到asciidoc和plantuml 是编写文档的极好工具 相对word和visio 最大的好处是可以实现代码版本管理 作为changelist asciid
  • eclipse运行,提示错误:The selection cannot be launched,and there are no recent launch

    错误原因 1 代码编辑错误 重点检查 main的拼写 String args 的拼写 类名后有没有空格 的书写等 2 没有定义类 需要先添加类 在文件中书写 如下 先新建Hello world类 再在生成的文件中书写代码 运行 就能得到正确
  • 没有与参数列表匹配的构造函数_C++构造函数和初始化表

    构造函数和初始化表 1 构造函数 当类对象被创建时 编译系统对象分配内存空间 并自动调用该构造函数 由构造函数完成成员的初始化工作 因此构造函数的作用是初始化对象的数据成员 2 构造函数可以重载 构造函数通过参数表的差别化可以形成重载 创建
  • 移动开发学习第二课学习记录

    图片资源 图片资源有 png jpg gif 9 png等文件 图片资源分类 应用图标资源村房子啊mipmap文件中 界面中使用的图片资源 存放在drawable文件夹中 一般不采用花哨的配色 除了个别的活动主题外 一般以浅色暖色为主 调用
  • Kioptrix: Level 2靶机实战 sql注入万能密码到后台 命令执行;getshell 内核漏洞9542 提权

    Kioptrix Level 1靶机实战 前言 0x01 信息收集 1 1 探测靶机ip 1 2 nmap探测端口 0x02 漏洞探测 2 1 访问首页 80端口 2 1 1远程系统管理员登录界面 2 1 1 1 尝试万能密码 2 1 1
  • 统计学中的Bootstrap方法(Bootstrap抽样)

    Bootstrap又称自展法 自举法 自助法 靴带法 是统计学习中一种重采样 Resampling 技术 用来估计标准误差 置信区间和偏差 Bootstrap是现代统计学较为流行的一种统计方法 在小样本时效果很好 机器学习中的Bagging
  • C语言实现成语接龙完整版

    C语言实现成语接龙报告完整版 代码在最后面 实验报告书 实验名称 成语接龙人机对战游戏 摘要 成语接龙是中华民族传统的文字游戏 它有着悠久的历史 也有广泛的社会基础 是老少皆宜的民间文化娱乐活动 同时成语又是体现我国文字 文化 文明的一个缩
  • c# 微信支付宝退款

    支付宝 根据官网接口参数传即可 private static string appId XXX appid private static string privateKeyPem XXX 私钥private static string Al
  • kong的端口简介以及如何远程连接kong的管理端口

    KONG的端口 kong有四个端口号 分别为两个代理端口 proxy listen 0 0 0 0 8000 0 0 0 0 8443 ssl 两个管理端口 admin listen 127 0 0 1 8001 127 0 0 1 844
  • PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)

    题目集地址 报名了12月的PAT B 先试试水 已完成 2018 10 22 2018 11 14 更新 2018 12 09 PAT乙级考试100分 考试代码已更新 冬天坐火车跑去考试冻懵了 来年对战PAT甲级考试 目录 目录 题目集地址