杭电1084 (C++)

这题的题目意思不难理解,关键在于获得它们的排名他,还要按照输入顺序输出得分。
要点
①创建结构数组s储存每个学生做对的题数和用的时间。
②拷贝一个①里面的结构数组a,然后对a排序,得到每个学生的排名,排名从0开始。0是最高的排名。
③判断(当前排名-比当前答对题数多的人数)是否大于或等于答对当前题数的一半人数。

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
struct student{
	int ac;//做对的题数 
	int h;//小时 
	int min;//分钟 
	int sec;//秒 
};
student s[100],a[100];

bool cmp(student x,student y);
//重载等于号 
bool operator==(const student&x,const student&y){
	return (x.ac==y.ac&&x.h==y.h&&x.min==y.min&&x.sec==y.sec);
}
int main()
{
	//struct student a[100];
	int num,i,j;
	int p1,p2,p3,p4,p5,top,f;
	while(scanf("%d",&num)!=EOF&&num>=0){
		p1=0;p2=0;p3=0;p4=0;p5=0;
		for(i=0;i<num;i++){
			scanf("%d",&s[i].ac);
			scanf("%d:%d:%d",&s[i].h,&s[i].min,&s[i].sec);
			a[i].ac=s[i].ac;//把s[]拷贝给a[] 
			a[i].h=s[i].h;a[i].min=s[i].min;a[i].sec=s[i].sec; 
		}
		sort(a,a+num,cmp);//对a[i]排序,为了得到s[i]的对应排名 
		for(i=0;i<num;i++){//统计算对1~5题的数目 
			if(s[i].ac==5) p5++;
			if(s[i].ac==4) p4++;
			if(s[i].ac==3) p3++;
			if(s[i].ac==2) p2++;
			if(s[i].ac==1) p1++;	
		}
		for(i=0;i<num;i++){
			if(s[i].ac==5) printf("100\n");
			if(s[i].ac==4){
				for(j=0;j<num;j++){//找到s[i]的排名 ,排名从0开始,0排名是最高的 
					if(s[i]==a[j])  top=j;
				}
				f=p4/2;//当前答对题数的一半人数 
				if(top-p5>=f) printf("90\n");//当前做对题数的排名-比它做对多的题数的人数 
				else printf("95\n");
			}
			if(s[i].ac==3){
				for(j=0;j<num;j++){
					if(s[i]==a[j])  top=j;
				}
				f=p3/2;
				if(top-p5-p4>=f) printf("80\n");
				else printf("85\n");
			}
			if(s[i].ac==2){
				for(j=0;j<num;j++){
					if(s[i]==a[j])  top=j;
				}
				f=p2/2;
				if(top-p5-p4-p3>=f) printf("70\n");
				else printf("75\n");
			}
			if(s[i].ac==1){
				for(j=0;j<num;j++){
					if(s[i]==a[j])  top=j;
				}
				f=p1/2;
				if(top-p5-p4-p3-p2>=f) printf("60\n");
				else printf("65\n");
			}
			if(s[i].ac==0) printf("50\n");
		}
		printf("\n");
	}
}
bool cmp(student x,student y)
{
	if(x.ac!=y.ac) return x.ac>y.ac;
	if(x.h!=y.h) return x.h<y.h;
	if(x.min!=y.min) return x.min<y.min;
	else return x.sec<y.sec;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值