• 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:

  • 相关阅读:
    Python3学习笔记24-操作文件和目录
    Python3学习笔记23-StringIO和BytesIO
    [Uva10934]Dropping water balloons
    [Uva10641]Barisal Stadium(区间dp)
    [hdu4960]Another OCD Patient(区间dp)
    [cf687c]The Values You Can Make(01背包变形)
    [Gym 101334E]Exploring Pyramids(区间dp)
    [bzoj4806]炮
    [hdu4662]MU Puzzle(找规律)
    [Uva12260]Free Goodies(dp+贪心)
  • 原文地址:https://www.cnblogs.com/meanttobe/p/11209764.html
Copyright © 2020-2023  润新知