排序A1025 A1028 A1055

A1025

#include<iostream>
#include<algorithm>
#include<vector> 
using namespace std;

struct node{
	long long int number;//序号代码,什么时候用long long int 
	int local,score;//所在的考场是1还是2 
	int localrank,finalrank;//自己在本考场的排名,自己在所有的排名 

};

bool cmp1(node a,node b)
{
	return (a.score!=b.score)?a.score>b.score:a.number<b.number;
 } //

int main()
{
	int n,m;

	scanf("%d",&n);//输入考场数
	
	vector<node> final;//两个考场合在一起的数组 
	
	for(int i=0;i<n;i++)
	{
		scanf("%d",&m);//输入考生数
		vector<node> v(m);//定义v[m]动态数组 
		for(int j=0;j<m;j++)
		{
			scanf("%lld %d",&v[j].number,&v[j].score);
			v[j].local=i+1; //记录一下在哪个考场 
		 } 
		sort(v.begin(),v.end(),cmp1);
		v[0].localrank=1;
		final.push_back(v[0]);//存入合在一起的数组里 
		for(int j=1;j<m;j++)
		{
			v[j].localrank=(v[j-1].score==v[j].score)?(v[j-1].localrank):(j+1);
			final.push_back(v[j]); 
		}
		
	 } 
	//记录考生一共有多少,两个考场考生按照总成绩排名,依次输出number,总成绩排名,
	//在哪个考场(1还是2),在自己考场的排名 
	sort(final.begin(),final.end(),cmp1);
	printf("%d\n",final.size());
	final[0].finalrank=1;
	for(int i=1;i<final.size();i++)
	{
		final[i].finalrank=(final[i-1].score==final[i].score)?(final[i-1].finalrank):(i+1);	
	}
	for(int i=0;i<final.size();i++)
	{
		printf("%013lld %d %d %d\n",final[i].number,final[i].finalrank,final[i].local,final[i].localrank);
	}//这里是踩分点 
	
	return 0;
 } 

什么时候用long long int
A1028
这是我这些天唯一一个靠自己写出来的题

//A1028
//column列,表格能根据任何列分类记录 
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

struct node{
	string name;
	long long int id;
	int grade;
};

bool cmp1(node a,node b)//c=1
{
	return a.id<b.id;
}

bool cmp2(node a,node b)
{
	return (a.name!=b.name)?a.name<b.name:a.id<b.id;
}

bool cmp3(node a,node b)
{
	return (a.grade!=b.grade)?a.grade<b.grade:a.id<b.id;
}
int main()
{
	int n,c;//如果c=1记录必须按照id从小到大输出
	//如果c=2记录必须按照名字字母增加输出
	//如果c=3记录必须按照成绩增加输出
	//如果有学生有相同的名字或成绩,他们必须按照id从小到大输出 
	scanf("%d %d",&n,&c);
	vector<node> student(n);
	for(int i=0;i<n;i++)
	{
		scanf("%lld",&student[i].id);
		cin>>student[i].name;
		scanf("%d",&student[i].grade);
	 } //把这些都输入完之后再输出 
	if(c==1)
	{
		sort(student.begin(),student.end(),cmp1);
	} 
	if(c==2)
	{
		sort(student.begin(),student.end(),cmp2);
	}
	if(c==3)//if里面判断是否为那个数的时候一定要写==号,否则编译不出错,我也找不出来 
	{
		sort(student.begin(),student.end(),cmp3);
	}
	for(int i=0;i<n;i++)
	{
		printf("%06lld ",student[i].id);//一定要确定好位数6,%06lld,否则输出不正确 
		cout<<student[i].name;
		printf(" %d",student[i].grade);
		printf("\n");
	}
	
	return 0;
 } 

A1055 我写的代码超时。。。。

//A1055
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>//用到了strcmp函数 
using namespace std;

struct node{
	char name[10];
	int age,worth;
};

bool cmp(node a,node b)
{
	if(a.worth!=b.worth)//if多不超时 
		return a.worth>b.worth;
	else if(a.age != b.age)
        return a.age < b.age;
    else
        return (strcmp(a.name, b.name) < 0);
 } //strcmp函数两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
//s1<s2时返回为负数,s1>s2时返回为正数,s1=s2时返回为0 
//a.name<b.name不对,以后都用strcmp函数 

int main()
{
	int n,k,m,amin,amax;//m是输出的最大值 
	scanf("%d %d",&n,&k);//n是人的总数,k是问题的总数
	vector<node> v(n);
	for(int i=0;i<n;i++)
	{
		scanf("%s %d %d",&v[i].name,&v[i].age,&v[i].worth);
		
	 } 
	sort(v.begin(),v.end(),cmp);
	for(int i=0;i<k;i++)
	{
		scanf("%d %d %d",&m,&amin,&amax);
		vector<node> t;
		for(int j=0;j<v.size();j++)
		{
			if(v[j].age>=amin&&v[j].age<=amax)
			t.push_back(v[j]);
		}
		printf("Case #%d:\n",i+1);
		int flag=0;
		for(int a=0;a<m&&a<t.size();a++)
		{
			printf("%s %d %d\n",t[a].name,t[a].age,t[a].worth);
			flag=1;
		}
		if(flag==0)
			printf("None");
	}
	//对于每一个问题首先输出Case #X:x就是从1开始的问题数
	//然后输出m个富有的人,她们的年龄在这个范围内
	//每个人的信息占一行,name age worth
	
	//输出必须按照worth由大到小的顺序 
	//如果worth相等,就按照age由小到大的顺序
	//如果worth和age都一样,就按照名字由小到大的顺序
	//如果没找到人,输出None 
	return 0; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值