sort+结构体+简单数学+暴力-例题

A-前m大的数

还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希只想让你把答案中最大的M个数告诉她就可以了。 
给定一个包含N(N<=3000)个正整数的序列,每个数不超过5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=1000)并按从大到小的顺序排列。

 Input:
输入可能包含多组数据,其中每组数据包括两行: 
第一行两个数N和M, 
第二行N个数,表示该序列。 
output:
对于输入的每组数据,输出M个数,表示结果。输出应当按照从大到小的顺序排列。
Sample Input:
4 4
1 2 3 4
4 5
5 3 6 4
Sample Output:
7 6 5 5
11 10 9 9 8
思路:
将每一个数与后边的数相加,存入数组,得到N*(N-1)/2个数,进行排序,取最大值即可。
B-稳定排序
大家都知道,快速排序是不稳定的排序方法。 
如果对于数组中出现的任意a[i],a[j](i<j),其中a[i]==a[j],在进行排序以后a[i]一定出现在a[j]之前,则认为该排序是稳定的。 
某高校招生办得到一份成绩列表,上面记录了考生名字和考生成绩。并且对其使用了某排序算法按成绩进行递减排序。现在请你判断一下该排序算法是否正确,如果正确的话,则判断该排序算法是否为稳定的。 
input:
本题目包含多组输入,请处理到文件结束。 
对于每组数据,第一行有一个正整数N(0<N<300),代表成绩列表中的考生数目。 
接下来有N行,每一行有一个字符串代表考生名字(长度不超过50,仅包含'a'~'z'),和一个整数代表考生分数(小于500)。其中名字和成绩用一个空格隔开。 
再接下来又有N行,是上述列表经过某排序算法以后生成的一个序列。格式同上。
output:
对于每组数据,如果算法是正确并且稳定的,就在一行里面输出"Right"。如果算法是正确的但不是稳定的,就在一行里面输出"Not Stable",并且在下面输出正确稳定排序的列表,格式同输入。如果该算法是错误的,就在一行里面输出"Error",并且在下面输出正确稳定排序的列表,格式同输入。 
注意,本题目不考虑该排序算法是错误的,但结果是正确的这样的意外情况。
Sample Input:
3
aa 10
bb 10
cc 20
cc 20
bb 10
aa 10
3
aa 10
bb 10
cc 20
cc 20
aa 10
bb 10
3
aa 10
bb 10
cc 20
aa 10
bb 10
cc 20

 Sample Output:

Not Stable
cc 20
aa 10
bb 10
Right
Error
cc 20
aa 10
bb 10

思路:建立一个结构体,分别是名字,成绩与出现次序,进行排序,得到稳定排序,与所给排序对比,得出结果。

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int INF=1e9;
struct aa{
	string s;
	int a;
	int b;
}arr[1000];
bool cmp(aa a1,aa b1){
	if(a1.a!=b1.a){
		return a1.a>b1.a;
	}
		return a1.b<b1.b;
	
}
int main(){
	int f=1;
	int m,flag,dd;
	string ss;
	while(cin>>m){
		flag=0;
		for(int i=0;i<m;i++){
			cin>>arr[i].s>>arr[i].a;
			arr[i].b=i;
		}
 		sort(arr,arr+m,cmp);
		for(int i=0;i<m;i++){
			cin>>ss>>dd;
			if(flag!=1){
			
				if(dd!=arr[i].a){
					flag=1;
				}
				else if(ss!=arr[i].s){
					flag=2;
				}
			}
		}
		if(!flag){
			cout<<"Right"<<endl;
		}
		else if(flag==1){
			cout<<"Error"<<endl;
			for(int i=0;i<m;i++){
				cout<<arr[i].s<<" "<<arr[i].a<<endl;
			}
		}
		else{
			cout<<"Not Stable"<<endl;
			for(int i=0;i<m;i++){
				cout<<arr[i].s<<" "<<arr[i].a<<endl;
			}
		}
	}
	return 0;
}

C-开门人与关门人

每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签 
到、签离记录,请根据记录找出当天开门和关门的人。

Input:

测试输入的第一行给出记录的总天数N ( > 0 )。下面列出了N天的记录。 
每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M行,每行的格式为 
证件号码 签到时间 签离时间 
其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。

output:

 

posted @ 2019-07-18 20:23  yya雨  阅读(308)  评论(0编辑  收藏  举报