hdoj 1084 What Is Your Grade?(sort函数按规则排序结构体数组)

思路:对输入的学生的解决问题数和用时进行排序;先排解觉问题的数目,再排用时;

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct node
{
	int slove;
	long time;
	int order;
	int mark;
}s[110];
bool cmp1(node a,node b)
{
	return a.order<b.order;
}
bool cmp2(node a,node b)
{
	if(a.slove!=b.slove)
	{
		return a.slove>b.slove;
	}
	else
	{
		return a.time<b.time;
	}
		
}

int main(int argc, char *argv[]) {
    
    int t;
    int k;
    int h,m,ss;
    int i;
    int sum1,sum2,sum3,sum4;
    int p1,p2,p3,p4;
    int x;
    x=0;
    while(scanf("%d",&t)!=EOF)
    {
    
    	if(t<0)
    		break;
    	k=0;
    	sum1=sum2=sum3=sum4=0;								//记录有多少个 同样成绩的人 
    	p1=p2=p3=p4=0;										//记录同样成绩的人已经有多少个 
    	while(t--)
    	{
    		scanf("%d %d:%d:%d",&s[k].slove,&h,&m,&ss);
    		s[k].time=h*3600+m*60+ss;
    		s[k].order=k;
    		
    		k++;
    		
		}
		
		sort(s,s+k,cmp2);									//按先解决的问题 数目,再解决的时间长短,进行排序; 
		for(i=0;i<k;i++)									//找相同成绩的人数 
		{
			if(s[i].slove==1)
				sum1++;
			if(s[i].slove==2)
				sum2++;
			if(s[i].slove==3)
				sum3++;
			if(s[i].slove==4)
				sum4++;
			
		}
		
		for(i=0;i<k;i++)									//为每个人赋成绩; 
		{
			
			switch (s[i].slove)
			{
				case 0:
					s[i].mark=50;
					break;
				case 1:
					if(p1<sum1/2)
						s[i].mark=65;
					else
						s[i].mark=60;
					p1++;
					break;
				case 2:
					if(p2<sum2/2)
						s[i].mark=75;
					else
						s[i].mark=70;
					p2++;
					break;
				case 3:
					if(p3<sum3/2)
						s[i].mark=85;
					else
						s[i].mark=80;
					p3++;
					break;
				case 4:
					if(p4<sum4/2)
						s[i].mark=95;
					else
						s[i].mark=90;
					p4++;
					break;
				case 5:
					s[i].mark=100;
					break;
				
					
			}
			
		}
		
		sort(s,s+k,cmp1);
		
		for(i=0;i<k;i++)
			printf("%d\n",s[i].mark);
		printf("\n");
	}

		
		
		
		
    		
	
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值