目錄
成績排序
整數奇偶排序1.0
成績排序2.0
國名排序
日志排序
整數奇偶排序2.0
字元串排序
解一
解二
字元串排序3
字尾子串排序
EXCEL排序
特殊排序
成績排序3.0
大整數排序
成績排序
題目描述:
輸入任意(使用者,成績)序列,可以獲得成績從高到低或從低到高的排列,相同成績都按先錄 入排列在前的規則處理。
輸入描述:
輸入多行,先輸入要排序的人的個數,然後輸入排序方法 0(降序)或者 1(升序)再分别輸 入他們的名字和成績,以一個空格隔開 輸出描述: 按照指定方式輸出名字和成績,名字和成績之間以一個空格隔開
輸入樣例#:
3
fang 90
yang 50
ning 70
輸出樣例#:
fang 90
ning 70
yang 50
- 穩定排序,sort 排序是不穩定的,排序之後相對次序有 可能發生改變。解決這個問題有兩個方法,一個是用 stable_sort 函數,它的用法和 sort 一 樣,但是它是穩定的,是以如果我們遇到有穩定的需求的排序時,可以用它。另一個方法是給 每一個輸入增加一個遞增的下标,然後二級排序,當值相同時,下标小的排在前面
#include <bits/stdc++.h>
using namespace std;
struct Student{
string name;
int grade;
}stu[1000];
bool cmp1(Student a,Student b){
return a.grade>b.grade;
}//從大到小排序
bool cmp2(Student a,Student b){
return a.grade<b.grade;
}//從小到大排序
int main(){
int n,order;
while(cin>>n){
cin>>order;
for(int i = 0;i<n;i++){
cin>>stu[i].name>>stu[i].grade;
}
if(order = 0)
stable_sort(stu,stu+n,cmp1);
else
stable_sort(stu,stu+n,cmp2);
for(int i = 0;i<n;i++){
cout<<stu[i].name<<" "<<stu[i].grade<<endl;
}
}
return 0;
}
整數奇偶排序1.0
題目描述:
輸入 n 個數進行排序,要求先按奇偶後按從小到大的順序排序。
輸入描述:
第一行輸入一個整數 n,表示總共有多少個數,n<=1000。 第二行輸入 n 個整數,用空格隔開。
輸出描述:
輸出排序之後的結果。
輸入樣例#:
8 1 2 3 4 5 6 7 8
輸出樣例#:
1 3 5 7 2 4 6
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
if(a%2==b%2) //同奇同偶,按照從小到大排序
return a<b;
else
return (a%2) >(b%2);//奇數在偶數前面
}
int main(){
int n;
int a[1005] = {0};
while(cin>>n){
for(int i = 0;i<n;i++)
cin>>a[i];
sort(a,a+n,cmp);
for(int i = 0;i<n;i++)
cout<<a[i]<<" "<<endl;
}
return 0;
}
成績排序2.0
題目描述
用一維數組存儲學号和成績,然後,按成績排序輸出。
輸入描述:
輸入第一行包括一個整數N(1<=N<=100),代表學生的個數。 接下來的N行每行包括兩個整數p和q,分别代表每個學生的學号和成績。
輸出描述:
按照學生的成績從小到大進行排序,并将排序後的學生資訊列印出來。 如果學生的成績相同,則按照學号的大小進行從小到大排序。
#include <bits/stdc++.h>
using namespace std;
struct Student{
int id;
int grade;
}stu[1005];
bool cmp(Student a,Student b){
if (a.grade != b.grade)
return a.grade <b.grade;
else
return a.id < b.id;//從小到大
}
int main(){
int n;
while(cin>>n){
for(int i = 0;i<n;i++)
cin>>stu[i].id>>stu[i].grade;
sort(stu,stu+n,cmp);
for(int i = 0;i<n;i++)
cout<<stu[i].id<<" "<<stu[i].grade<<endl;
}
return 0;
}
國名排序
題目描述
問題描述: 小李在準備明天的廣交會,明天有來自世界各國的客房跟他們談生意,小李要盡快的整理出名單給經理,你能幫他把客戶來自的國家按英文字典次序排好嗎? 例如小李手上有來自加拿大,美國,中國的名單,排好的名單應是美國,加拿大,中國
輸入描述:
第一行為一個n(n<=100)表示n個國家,第2行到第n+1行分别為n個國家的名字.
輸出描述:
輸出n個國家按字典順序的排列.
輸入樣例#:
3 China Canada America
輸出樣例
America Canada China
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n){
string s[n];
for(int i = 0;i<n;i++)
cin>>s[i];
sort(s,s+n);
for(int i = 0;i<n;i++)
cout<<s[i]<<endl;
}
return 0;
}
日志排序
題目描述
有一個網絡日志,記錄了網絡中計算任務的執行情況,每個計算任務對應一條如下形式的日志記錄: “hs_10000_p”是計算任務的名稱, “2007-01-17 19:22:53,315”是計算任務開始執行的時間“年-月-日 時:分:秒,毫秒”, “253.035(s)”是計算任務消耗的時間(以秒計) hs_10000_p 2007-01-17 19:22:53,315 253.035(s) 請你寫一個程式,對日志中記錄計算任務進行排序。 時間消耗少的計算任務排在前面,時間消耗多的計算任務排在後面。 如果兩個計算任務消耗的時間相同,則将開始執行時間早的計算任務排在前面。
輸入描述:
日志中每個記錄是一個字元串,每個字元串占一行。最後一行為空行,表示日志結束。日志中最多可能有10000條記錄。 計算任務名稱的長度不超過10,開始執行時間的格式是YYYY-MM-DD HH:MM:SS,MMM,消耗時間小數點後有三位數字。 計算任務名稱與任務開始時間、消耗時間之間以一個或多個空格隔開,行首和行尾可能有多餘的空格。
輸出描述:
排序好的日志記錄。每個記錄的字元串各占一行。 輸入的格式與輸入保持一緻,輸入包括幾個空格,你的輸出中也應該包含同樣多的空格。
輸入樣例#:
hs_10000_p 2007-01-17 19:22:53,315 253.035(s) hs_10001_p 2007-01-17 19:22:53,315 253.846(s) hs_10002_m 2007-01-17 19:22:53,315 129.574(s) hs_10002_p 2007-01-17 19:22:53,315 262.531(s) hs_10003_m 2007-01-17 19:22:53,318 126.622(s) hs_10003_p 2007-01-17 19:22:53,318 136.962(s) hs_10005_m 2007-01-17 19:22:53,318 130.487(s) hs_10005_p 2007-01-17 19:22:53,318 253.035(s) hs_10006_m 2007-01-17 19:22:53,318 248.548(s) hs_10006_p 2007-01-17 19:25:23,367 3146.827(s)
輸出樣例#:
hs_10003_m 2007-01-17 19:22:53,318 126.622(s) hs_10002_m 2007-01-17 19:22:53,315 129.574(s) hs_10005_m 2007-01-17 19:22:53,318 130.487(s) hs_10003_p 2007-01-17 19:22:53,318 136.962(s) hs_10006_m 2007-01-17 19:22:53,318 248.548(s) hs_10000_p 2007-01-17 19:22:53,315 253.035(s) hs_10005_p 2007-01-17 19:22:53,318 253.035(s) hs_10001_p 2007-01-17 19:22:53,315 253.846(s) hs_10002_p 2007-01-17 19:22:53,315 262.531(s) hs_10006_p 2007-01-17 19:25:23
#include <bits/stdc++.h>
using namespace std;
struct Task{
char allLog[200];
char name[12];
char start_day[15];
char start_time[15];
char wastetime[15];
}tasks[1005];
bool cmp(Task a,Task b){
int len1 = strlen( a.wastetime);
int len2 = strlen( b.wastetime);
if (len1!=len2) {return len1 < len1;
}
else {
int x = strcmp(a.wastetime,b.wastetime);
if (x!=0){
return x<0;
}
else{
int x = strcmp( a.start_day,b.start_day);
if (x!=0) {
return x<0;}
else{
return strcmp( a.start_time,b.start_time)<0;
}
}
}
}
int main(){
int n = 0;
while(gets(tasks[n].allLog))
{
sscanf(tasks[n].allLog,"%s%s%s%s",tasks[n].name,tasks[n].start_day,tasks[n].start_time,tasks[n].wastetime);
n++;
}
sort(tasks,tasks+n,cmp);
for(int i = 0;i<n;i++){
cout<<tasks[i].allLog<<endl;
}
return 0;
}
整數奇偶排序2.0
題目描述
輸入10個整數,彼此以空格分隔。重新排序以後輸出(也按空格分隔),要求: 1.先輸出其中的奇數,并按從大到小排列; 2.然後輸出其中的偶數,并按從小到大排列。
輸入描述:
任意排序的10個整數(0~100),彼此以空格分隔。
輸出描述:
可能有多組測試資料,對于每組資料,按照要求排序後輸出,由空格分隔。 1. 測試資料可能有很多組,請使用while(cin>>a[0]>>a[1]>>...>>a[9])類似的做法來實作; 2. 輸入資料随機,有可能相等。
輸入樣例#:
4 7 3 13 11 12 0 47 34 98
輸出樣例#:
47 13 11 7 3 0 4 12 34 98
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
//兩個數都是奇數
if(a%2 &&b%2) {
return a>b;
}
//兩個都為偶數
else if(a%2==0 &&b%2==0) {
return a<b;
}
else return (a%2) > (b%2) ;
}
int main(){
int a[10] ;
while(cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9]){
sort(a,a+10,cmp);
for (int i = 0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}
字元串排序
題目描述
輸入一個長度不超過20的字元串,對所輸入的字元串,按照ASCII碼的大小從小到大進行排序,請輸出排序後的結果
輸入描述:
一個字元串,其長度n<=20
輸出描述:
輸入樣例可能有多組,對于每組測試樣例, 按照ASCII碼的大小對輸入的字元串從小到大進行排序,輸出排序後的結果
輸入樣例#:
dcba
輸出樣例#:
abcd
解一
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
sort(s.begin(),s.end());
cout<<s<<endl;
return 0;
}
解二
#include <bits/stdc++.h>
using namespace std;
int main(){
char s[20];
scanf("%s",&s);
int len = strlen(s);
sort(s,s+len);
printf("%s",s);
return 0;
}
字元串排序3
題目描述
先輸入你要輸入的字元串的個數。然後換行輸入該組字元串。每個字元串以回車結束,每個字元串少于一百個字元。 如果在輸入過程中輸入的一個字元串為“stop”,也結束輸入。 然後将這輸入的該組字元串按每個字元串的長度,由小到大排序,按排序結果輸出字元串。
輸入描述:
字元串的個數,以及該組字元串。每個字元串以‘\n’結束。如果輸入字元串為“stop”,也結束輸入.
輸出描述:
可能有多組測試資料,對于每組資料, 将輸入的所有字元串按長度由小到大排序輸出(如果有“stop”,不輸出“stop”)。 根據輸入的字元串個數來動态配置設定存儲空間(采用new()函數)。每個字元串會少于100個字元。 測試資料有多組,注意使用while()循環輸入。
輸入樣例#:
5 sky is grey cold very cold stop 3 it is good enough to be proud of good it is quite good
輸出樣例#:
cold very cold sky is grey good it is quite good it is good enough to be proud of
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool cmp(string a,string b){
return a.length() <b.length() ;
}
int main(){
int n;
while(cin>>n)
{
getchar();//接收cin完的空格
string a[n];
for(int i;i<n;i++)
{
string s;
getline(cin,s);
if(s==" ")
{
i--;//遇到空格退回空格前面的字元
continue;
}
if(s == "stop")
{
n = i;//停止輸入,i比n小1
break;
}
else a[i] = s;
}
sort(a,a+n,cmp);
for(int i = 0;i<n;i++)
cout<<a[i]<<endl;
}
return 0;
}
字尾子串排序
題目描述
對于一個字元串,将其字尾子串進行排序,例如grain 其子串有: grain rain ain in n 然後對各子串按字典順序排序,即: ain,grain,in,n,rain
輸入描述:
多組資料輸入。 每個案例為一行字元串。
輸出描述:
将子串排序輸出
輸入樣例#:
grain
輸出樣例#:
ain grain in n rain
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool cmp(string a,string b){
return a < b;
}
int main(){
string s;
string s2[1005];
while(cin>>s){
int len = s.size();
for (int i = 0;i<len;i++){
string a = s.substr(i,len-i);
s2[i] = a;
}
sort(s2,s2+len,cmp);
for(int i = 0;i<len;i++)
cout<<s2[i]<<endl;
}
return 0;
}
EXCEL排序
題目描述
Excel可以對一組紀錄按任意指定列排序。現請你編寫程式實作類似功能。 對每個測試用例,首先輸出1行“Case i:”,其中 i 是測試用例的編号(從1開始)。随後在 N 行中輸出按要求排序後的結果,即:當 C=1 時,按學号遞增排序;當 C=2時,按姓名的非遞減字典序排序;當 C=3 時,按成績的非遞減排序。當若幹學生具有相同姓名或者相同成績時,則按他們的學号遞增排序。
輸入描述:
測試輸入包含若幹測試用例。每個測試用例的第1行包含兩個整數 N (N<=100000) 和 C,其中 N 是紀錄的條數,C 是指定排序的列号。以下有N行,每行包含一條學生紀錄。每條學生紀錄由學号(6位數字,同組測試中沒有重複的學号)、姓名(不超過8位且不包含空格的字元串)、成績(閉區間[0, 100]内的整數)組成,每個項目間用1個空格隔開。當讀到 N=0 時,全部輸入結束,相應的結果不要輸出。
輸出描述:
對每個測試用例,首先輸出1行“Case:”。随後在 N 行中輸出按要求排序後的結果,即:當 C=1 時,按學号遞增排序;當 C=2時,按姓名的非遞減字典序排序;當 C=3 時,按成績的非遞減排序。當若幹學生具有相同姓名或者相同成績時,則按他們的學号遞增排序。
輸入樣例#:
3 1 000007 James 85 000010 Amy 90 000001 Zoe 60
輸出樣例#:
Case: 000001 Zoe 60 000007 James 85 000010 Amy 90
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct student{
char name[10];
char id[10];
int grade;
}stu[20000];
bool cmp1(student a,student b){
return strcmp(a.id,b.id)<0;
}
bool cmp2(student a,student b){
if(strcmp(a.name,b.name)==0)
return strcmp(a.id,b.id)<0;
else
return strcmp(a.name,b.name)<0;
}
bool cmp3(student a,student b){
if(a.grade==b.grade)
return strcmp(a.id,b.id)<0;
else
return a.grade<b.grade;
}
int main(){
int n,C;
cin>>n>>C;
for(int i= 0;i<n;i++){
getchar();
cin>>stu[i].id>>stu[i].name>>stu[i].grade;
}
switch(C){
case 1:
stable_sort(stu,stu + n,cmp1);
break;
case 2:
stable_sort(stu,stu + n,cmp2);
break;
case 3:
stable_sort(stu,stu + n,cmp3);
break;
default:
break;
}
cout<<"Case:"<<endl;
for (int i = 0;i<n;i++)
cout << stu[i].id<<" "<<stu[i].name<<" "<<stu[i].grade<<endl;
return 0;
}
特殊排序
題目描述
輸入一系列整數,将其中最大的數挑出(如果有多個,則挑出一個即可),并将剩下的數進行排序,如果無剩餘的數,則輸出-1。
輸入描述:
輸入第一行包括1個整數N,1<=N<=1000,代表輸入資料的個數。 接下來的一行有N個整數。
輸出描述:
可能有多組測試資料,對于每組資料, 第一行輸出一個整數,代表N個整數中的最大值,并将此值從數組中去除,将剩下的數進行排序。 第二行将排序的結果輸出。
輸入樣例#:
4 1 3 4 2
輸出樣例#:
4 1 2 3
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int n;
int a[1009];
while(cin>>n){
for (int i= 0;i<n;i++)
cin>>a[i];
sort(a,a+n);
cout<<a[n-1]<<endl;//輸出最大值
for (int i= 0;i<n-1;i++) //對去掉最大值剩下的數進行排序
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
成績排序3.0
題目描述
有N個學生的資料,将學生資料按成績從低到高排序,如果成績相同則按姓名字元的字典序排序,如果姓名的字典序也相同則按照學生的年齡從小到大排序,并輸出N個學生排序後的資訊。
輸入描述:
測試資料有多組,每組輸入第一行有一個整數N(N<=1000),接下來的N行包括N個學生的資料。 每個學生的資料包括姓名(長度不超過100的字元串)、年齡(整形數)、成績(小于等于100的正數)。
輸出描述:
将學生資訊按成績進行排序,成績相同的則按姓名的字母序進行排序。 然後輸出學生資訊,按照如下格式: 姓名 年齡 成績 學生姓名的字母序區分字母的大小寫,如A要比a的字母序靠前(因為A的ASC碼比a的ASC碼要小)。
輸入樣例#:
3 abc 20 99 bcd 19 97 bed 20 97
輸出樣例#:
bcd 19 97 bed 20 97 abc 20 99
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct student{
int grade;
char name[100];
int age;
}stu[1000];
bool cmp(student a,student b){
if (a.grade==b.grade) return strcmp(a.name,b.name)<0;
else if(strcmp(a.name,b.name)==0) return a.age<b.age;
else return a.grade <b.grade;
}
int main(){
int n;
while(cin>>n){
for(int i = 0;i<n;i++)
cin>>stu[i].name>>stu[i].age>>stu[i].grade;
sort(stu,stu + n,cmp);
for(int i = 0;i<n;i++)
cout<<stu[i].name<<" "<<stu[i].age<<" "<<stu[i].grade<<endl;
}
return 0;
}
大整數排序
題目描述
對N個長度最長可達到1000的數進行排序。
輸入描述:
輸入第一行為一個整數N,(1<=N<=100)。 接下來的N行每行有一個數,數的長度範圍為1<=len<=1000。 每個數都是一個正數,并且保證不包含字首零。
輸出描述:
可能有多組測試資料,對于每組資料,将給出的N個數從小到大進行排序,輸出排序後的結果,每個數占一行。
輸入樣例#:
3 11111111111111111111111111111 2222222222222222222222222222222222 33333333
輸出樣例#:
33333333 11111111111111111111111111111 222222222222222222222222222222
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool cmp(string a,string b){
if (a.length()==b.length())
return a<b;
else return a.length() < b.length();
}
int main(){
int n;
string s[1005];
while(cin>>n){
for(int i = 0;i<n;i++)
cin>>s[i];
sort(s,s+n,cmp);
for (int i = 0;i<n;i++)
cout<<s[i]<<endl;
}
return 0;
}