排序

P1177 【模板】快速排序

    • 25.2K通过
    • 72.8K提交
  • 题目提供者
  • 评测方式云端评测
  • 标签高性能
  • 难度普及-
  • 时空限制3000ms / 128MB

  题解   

  • 提示:收藏到任务计划后,可在首页查看。

最新讨论显示

推荐的相关题目显示

题目描述

利用快速排序算法将读入的 NN 个数从小到大排序后输出。

快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。( C++C++ 选手请不要试图使用STL,虽然你可以使用sort一遍过,但是你并没有掌握快速排序算法的精髓。)

输入输出格式

输入格式:

 

第 11 行为一个正整数 NN ,第 22 行包含 NN 个空格隔开的正整数 a_iai ,为你需要进行排序的数,数据保证了 A_iAi 不超过 10000000001000000000 。

 

输出格式:

 

将给定的 NN 个数从小到大输出,数之间空格隔开,行末换行且无空格。

 

输入输出样例

输入样例#1: 复制
5
4 2 4 5 1
输出样例#1: 复制
1 2 4 4 5

说明

对于 20\%20% 的数据,有 N≤1000N1000 ;

对于 100\%100% 的数据,有 N≤100000N100000 。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define random(a,b) (rand()%(b-a+1)+a)
 4 int a[100005];
 5 int m(int l,int r);
 6 void s(int l,int r);
 7 int main(){
 8     int n;
 9     scanf("%d",&n);
10     for(int i=0;i<n;i++){
11         scanf("%d",&a[i]);
12     }
13     s(0,n);
14     for(int i=0;i<n;i++){
15         printf("%d ",a[i]);
16     }
17 }
18 void s(int l,int r){
19     if(l<r){
20         int p=m(l,r);
21         s(l,p);
22         s(p+1,r);    
23     }
24 }
25 int m(int l,int r){
26     srand((unsigned)time(NULL));
27     int t=random(l,r-1);
28     swap(a[r-1],a[t]);
29     int k=a[r-1];
30     int i=l-1,j=l;
31     while(j<r-1){
32         if(a[j]<=k) i++,swap(a[i],a[j]);
33         j++;
34     }
35     swap(a[i+1],a[r-1]);
36     return i+1;
37 }

P1059 明明的随机数

    • 19.9K通过
    • 37K提交
  • 题目提供者CCF_NOI
  • 评测方式云端评测
  • 标签NOIp普及组2006
  • 难度入门难度
  • 时空限制1000ms / 128MB

  题解   

  • 提示:收藏到任务计划后,可在首页查看。

最新讨论显示

推荐的相关题目显示

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 NN 个 11 到 10001000 之间的随机整数 (N≤100)(N100) ,对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入输出格式

输入格式:

 

输入有两行,第 11 行为 11 个正整数,表示所生成的随机数的个数 NN

第 22 行有 NN 个用空格隔开的正整数,为所产生的随机数。

 

输出格式:

 

输出也是两行,第 11 行为 11 个正整数 MM ,表示不相同的随机数的个数。

第 22 行为 MM 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

 

输入输出样例

输入样例#1: 复制
10
20 40 32 67 40 20 89 300 400 15
输出样例#1: 复制
8
15 20 32 40 67 89 300 400

说明

NOIP 2006 普及组 第一题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 set<int>s;
 4 int n;
 5 int main(){
 6     scanf("%d",&n);
 7     for(int i=0;i<n;i++){
 8         int a;
 9         scanf("%d",&a);
10         s.insert(a);
11     }
12     set<int>::iterator pos;
13     printf("%d\n",s.size());
14     for(pos=s.begin();pos!=s.end();pos++){
15         printf("%d ",*pos);
16     }
17 }

P1068 分数线划定

题目描述

世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才, AA 市对

所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根

据计划录取人数的 150\%150% 划定,即如果计划录取 mm 名志愿者,则面试分数线为排名第 m \times 150\%m×150%

(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有

选手。

现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成

绩。

输入输出格式

输入格式:

 

第一行,两个整数 n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n)n,m(5n5000,3mn) ,中间用一个空格隔开,其

中 nn 表示报名参加笔试的选手总数, mm 表示计划录取的志愿者人数。输入数据保证 m \times 150\%m×150%

向下取整后小于等于 nn 。

第二行到第 n+1n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号 k(1000 ≤ k ≤ 9999)k(1000k9999)和该选手的笔试成绩 s(1 ≤ s ≤ 100)s(1s100) 。数据保证选手的报名号各不相同。

 

输出格式:

 

第一行,有 22 个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。

从第二行开始,每行包含 22 个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。

 

输入输出样例

输入样例#1: 复制
6 3 
1000 90 
3239 88 
2390 95 
7231 84 
1005 95 
1001 88
输出样例#1: 复制
88 5 
1005 95 
2390 95 
1000 90 
1001 88 
3239 88 

说明

【样例说明】

m \times 150\% = 3 \times150\% = 4.5m×150%=3×150%=4.5 ,向下取整后为 44 。保证 44 个人进入面试的分数线为 8888 ,但因为 8888 有重分,所以所有成绩大于等于 8888 的选手都可以进入面试,故最终有 55 个人进入面试。

NOIP 2009 普及组 第二题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct p{
 4     int hao,bi;
 5 }a[5005];
 6 set<int> s;
 7 int n,m;
 8 bool cmp(p x,p y);
 9 int main(){
10     scanf("%d%d",&n,&m);
11     m=m*1.5;
12     for(int i=0;i<n;i++) scanf("%d%d",&a[i].hao,&a[i].bi);
13     sort(a,a+n,cmp);
14     int fen=a[m-1].bi;
15     int sum=0;
16     for(int j=0;j<n;j++) if(a[j].bi>=fen) sum++;
17     printf("%d %d\n",fen,sum);    
18     for(int j=0;j<n;j++) if(a[j].bi>=fen) printf("%d %d\n",a[j].hao,a[j].bi);
19 } 
20 bool cmp(p x,p y){
21     if(x.bi!=y.bi) return x.bi>y.bi;
22     return x.hao<y.hao;
23 }

P1781 宇宙总统

题目背景

宇宙总统竞选

题目描述

地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。

输入输出格式

输入格式:

 

president.in

第一行为一个整数n,代表竞选总统的人数。

接下来有n行,分别为第一个候选人到第n个候选人的票数。

 

输出格式:

 

president.out

共两行,第一行是一个整数m,为当上总统的人的号数。

第二行是当上总统的人的选票。

 

输入输出样例

输入样例#1: 复制
5
98765
12365
87954
1022356
985678
输出样例#1: 复制
4
1022356

说明

票数可能会很大,可能会到100位数字。

n<=20

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char s[105];
 4 char s1[105];
 5 int main(){
 6     int n;
 7     scanf("%d",&n);
 8     int ma=0;
 9     int xiabiao=-1;
10     for(int i=0;i<n;i++){
11         scanf("%s",s);
12         int len=strlen(s);
13         if(len>ma) strcpy(s1,s),ma=len,xiabiao=i+1;
14         else if(len==ma){
15             int flag=0;
16             for(int i=0;i<len;i++){
17                 if(s1[i]<s[i]){
18                     flag=1;break;
19                 }
20                 else if(s1[i]>s[i]) break;
21             }
22             if(flag) strcpy(s1,s),xiabiao=i+1;
23         }
24     }
25     printf("%d\n%s\n",xiabiao,s1);
26 }

 

posted on 2018-08-15 19:44  大海浩瀚  阅读(289)  评论(0)    收藏  举报

导航