第一次上机考试总结

第一次上机考试总结

题目是比较基础的,出现的问题有:
1.看题不仔细,第一题第二次提交才完全通过;
2.小细节暴露习惯问题,第三题代码写对了,但是因为最后少个’\n’浪费了时间;
3.逻辑理顺方面有问题,第四题没有把情况考虑清楚;
4.方法累计不够,第五题,求最优解,暴力都没有掌握。
贴上第四题和第五题题目与题解

D. 乒乓球比赛二

运行时间限制: 1000 运行内存限制: 65536
作者: scshuanghai 是否specialjudge: False
题目描述
乒乓球单打比赛一般都采用七局四胜制,也就是说打7局,先赢4局的人获胜。某次比赛,组委会决定修改规则。新规则规定,如果出现3:0或0:3,则比赛结束,判赢3局的一方获胜,如果没有出现3:0或0:3,则必须打满7局且赢的局数多的人获胜。

现请你根据此规则写一段程序来判断一场比赛的胜负。

输入:只有一行,为用空格分隔的两个整数m,n(0<=m,n<=200),依次代表A选手和B选手的得分。

输出:
只有一行,如果A获胜则输出A win,如果B获胜则输出B win,如果无法判断胜负(如1:1,更准确的说法应该是比赛没结束)则输出no result,如果出现不可能出现的比分(如:8:0),则输出error。

输入样例
5 2
输出样例
A win
最后提交的代码

#include<stdio.h>
int main(){
	int m,n;
	scanf("%d%d",&m,&n);
	/*if((m+n)<=7){
		if((m==3&&n==0)||m>n)printf("A win");
		else if((m==0&&n==3)||n>m)printf("B win");
		else if(m==n)printf("no result");
	}
	else printf("error");*/
	if((m+n)>7)printf("error");
	else if((m==3)&&(n==0))printf("A win");
	else if((m==0)&&(n==3))printf("B win");
	else if(m>n)printf("A win");
	else if(m<n)printf("B win");
	else if(m==n)printf("no result");
	return 0;
}

改进后完全AC的代码

#include<stdio.h>
int main(){
	int m,n;
	scanf("%d%d",&m,&n);
	/*if((m+n)<=7){
		if((m==3&&n==0)||m>n)printf("A win");
		else if((m==0&&n==3)||n>m)printf("B win");
		else if(m==n)printf("no result");
	}
	else printf("error");*/
	if((m+n)>7||(m==0&&n>3)||(m>3&&n==0))printf("error");//不可能存在的结果还包括0:大于三的数,反之; 
	else if((m==3)&&(n==0))printf("A win");
	else if((m==0)&&(n==3))printf("B win");
	else if((m+n)==7&&(m!=0||n!=0)){//必须打完七场 
		if(m>n)printf("A win");
		if(m<n)printf("B win");
	}
	else printf("no result");//未打完七场, 
	return 0;
}

E. 贴邮票

运行时间限制: 1000 运行内存限制: 65536
作者: scsyuanbaoku 是否specialjudge: False
题目描述
现在有两种面值的邮票,一种为8角,一种为6角。你要付n角的邮资(不能多付也不能少付),请给出邮票张数最少的方案。如果没有正好的方案则输出-1。

输入:
只有一行,为若干个整数(至少有两个)。这些整数中的最后一个一定是-1,其他整数均大于0,这些大于0的整数代表邮资。

输出
若干行,每行依次对应输入的一个邮资,如果该邮资有正好的方案,则为两个用空格分隔的整数,代表张数最少的方案。前边的数字代表需要的8角的邮票的张数,后边的数字代表6角的邮票的张数;如果该邮资没有正好的方案则输出-1。测试用例保证所有整数均可以用int存储。

输入样例
24 14 11 -1
输出样例
3 0
1 1
-1
最后提交的代码
问题:以为除(除法的除)了最大的数就能得到符合题意的方案。然而还有这种情况:若邮资为18,用8去除,2张8角还有2邮资,6角邮票无法使用,即方案不成立。然而分明可以用3张6角直接搞定。由此,以下代码不对。

#include<stdio.h>
int main(){
	int n,i=0,j=0;
	while(1){
		scanf("%d",&n);
		if(n==-1)break;
		else{
			int a=n/8,b=n%8,c=(n-(n/8)*8)%6,d=(n-(n/8)*8)/6;
			//a为8角邮票的张数,b验证是否整除8,c验证减掉8角邮票后6角邮票是否整除,即整个方案是否成立,d是6角邮票张数。
			if(b==0){i=a;printf("%d %d\n",i,j);
			}
			else if((b!=0)&&(c==0)){i=a;j=d;printf("%d %d\n",i,j);
			}
			else printf("-1\n");
		}
		} 
	return 0;
}

完全AC的代码
思路是,分别在8角邮票和6角邮票的解空间找到值,加起来比较是否为最小即可。

#include<stdio.h>
int main(){
	int n;
	while(1){
		scanf("%d",&n);
		if(n==-1)break;
		int sum=0x7fffffff,i,j,a=0,b=0;//取sum为int型最大值 
		for(i=0;i<=n/6;i++){//等于号很关键,要取n/6  双重循环寻找最优解 
			for(j=0;j<=(n-i*6)/8;j++){
				//printf("%d %d\n",i,j);
				if(((i*6+j*8)==n)&&(sum>(i+j))){
					sum=(i+j);
					a=i;b=j;
				}
			}
		}
		if(a||b)printf("%d %d\n",b,a);
		//printf("%d",sum);
		else printf("-1\n");
	}
	return 0;
} 
发布了26 篇原创文章 · 获赞 18 · 访问量 1659

猜你喜欢

转载自blog.csdn.net/qq_40774136/article/details/102539715