2022/6/28随笔
// P1271 【深基9.例1】选举学生会
P1271 【深基9.例1】选举学生会 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//计数排序,入过先统一录入,后期处理的发杂度太大
//现在输入种类比较少,可以对输入数据进行统计
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int const maxn=10005; 5 int a[maxn]; 6 int n,m; 7 int main() 8 { 9 cin>>n>>m; 10 int b; 11 for(int i=1;i<=m;i++) 12 { 13 cin>>b; 14 a[b]++; 15 } 16 for(int i=1;i<=n;i++) 17 { 18 for(int j=1;j<=a[i];j++) 19 { 20 cout<<i<<" "; 21 } 22 } 23 return 0; 24 }
//P1177 【模板】快速排序
P1177 【模板】快速排序 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=1e5+10; 5 int a[maxn]; 6 int n; 7 void qsort(int a[],int l,int r) 8 { 9 int i=l,j=r,flag=a[(l+r)/2],tmp; 10 while(i<=j) 11 { 12 while(a[i]<flag) i++; 13 while(a[j]>flag) j--; 14 if(i<=j) 15 { 16 tmp=a[i]; 17 a[i]=a[j]; 18 a[j]=tmp; 19 i++; 20 j--; 21 } 22 } 23 if(l<j) qsort(a,l,j); 24 if(r>i) qsort(a,i,r); 25 } 26 int main() 27 { 28 cin>>n; 29 for(int i=0;i<n;i++) 30 { 31 cin>>a[i]; 32 } 33 qsort(a,0,n-1); 34 for(int i=0;i<n;i++) 35 { 36 cout<<a[i]<<" "; 37 } 38 return 0; 39 }
//P1923 【深基9.例4】求第 k 小的数
P1923 【深基9.例4】求第 k 小的数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//分治,一边快排,一边缩小范围
//如果用分治,cin,cout只能过80%,必须提速
方法1:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=5000005; 5 int a[maxn]; 6 int n,k,ans=0; 7 void findk(int l,int r) 8 { 9 int i=l,j=r,flag=a[(l+r)/2],tmp; 10 while(i<=j) 11 { 12 while(a[i]<flag) i++; 13 while(a[j]>flag) j--; 14 if(i<=j) 15 { 16 tmp=a[i]; 17 a[i]=a[j]; 18 a[j]=tmp; 19 i++; 20 j--; 21 } 22 } 23 if(k<=j) findk(l,j); 24 else if(k>=i) findk(i,r); 25 else 26 { 27 cout<<a[j+1]; 28 return; 29 } 30 } 31 int main() 32 { 33 ios::sync_with_stdio(false); 34 cin.tie(0); 35 cout.tie(0); 36 cin>>n>>k; 37 for(int i=0;i<n;i++) 38 { 39 cin>>a[i]; 40 } 41 findk(0,n-1); 42 return 0; 43 }
方法2:
//nth_element函数
//最小为第0小
//也要提速
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=5000000+10; 5 int a[maxn]; 6 int n,k; 7 int main() 8 { 9 ios::sync_with_stdio(false); 10 cin.tie(0); 11 cout.tie(0); 12 cin>>n>>k; 13 for(int i=0;i<n;i++) 14 { 15 cin>>a[i]; 16 } 17 nth_element(a,a+k,a+n); 18 cout<<a[k]<<endl; 19 return 0; 20 }
方法3:
//先快排序,再输出相应的值
//sort默认递增,全部排一遍平均时间复杂度太大,只能拿60%
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=5000000+10; 5 int a[maxn]; 6 int n,k; 7 int main() 8 { 9 ios::sync_with_stdio(false); 10 cin.tie(0); 11 cout.tie(0); 12 cin>>n>>k; 13 for(int i=0;i<n;i++) 14 { 15 cin>>a[i]; 16 } 17 sort(a,a+n); 18 cout<<a[k]<<endl; 19 return 0; 20 }
//P1059 [NOIP2006 普及组] 明明的随机数
P1059 [NOIP2006 普及组] 明明的随机数 - 洛谷 | 计算机科学教育新生态 (luogu.com.
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=105; 5 int a[maxn],n; 6 int main() 7 { 8 cin>>n; 9 for(int i=0;i<n;i++) 10 { 11 cin>>a[i]; 12 } 13 sort(a,a+n); 14 int cnt=unique(a,a+n)-a;//unique返回的是第一个重复数据的地址, 15 //减去首地址刚好是下标(有序个数) 16 cout<<cnt<<endl; 17 for(int i=0;i<cnt;i++) 18 { 19 cout<<a[i]<<" "; 20 } 21 return 0; 22 }
//P1093 [NOIP2007 普及组] 奖学金
P1093 [NOIP2007 普及组] 奖学金 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=350; 5 struct node 6 { 7 int id; 8 int sum; 9 int china; 10 }a[maxn]; 11 int n; 12 bool cmp(node x,node y) 13 { 14 if(x.sum!=y.sum) return x.sum>y.sum; 15 else if(x.china!=y.china) return x.china>y.china; 16 else return x.id<y.id; 17 } 18 int main() 19 { 20 int b,c,d; 21 cin>>n; 22 for(int i=1;i<=n;i++) 23 { 24 a[i].id=i; 25 cin>>b>>c>>d; 26 a[i].china=b; 27 a[i].sum=b+c+d; 28 } 29 sort(a+1,a+n+1,cmp); 30 for(int i=1;i<=5&&n>=1;i++) 31 { 32 n--; 33 cout<<a[i].id<<" "<<a[i].sum<<endl; 34 } 35 return 0; 36 }
//P1781 宇宙总统
P1781 宇宙总统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//string的size和length没有任何区别
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int n; 5 struct node 6 { 7 int num; 8 string str; 9 }a[25]; 10 bool cmp(node x,node y) 11 { 12 if(x.str.size()!=y.str.size()) return x.str.size()>y.str.size(); 13 else return x.str>y.str; 14 } 15 int main() 16 { 17 cin>>n; 18 for(int i=1;i<=n;i++) 19 { 20 a[i].num=i; 21 cin>>a[i].str; 22 } 23 sort(a+1,a+n+1,cmp); 24 cout<<a[1].num<<endl; 25 cout<<a[1].str<<endl; 26 return 0; 27 }
//P2676 [USACO07DEC]Bookshelf B
P2676 [USACO07DEC]Bookshelf B - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=20010; 5 int n,s,a[maxn],ans=0; 6 bool cmp(int x,int y) 7 { 8 return x>y; 9 } 10 int main() 11 { 12 cin>>n>>s; 13 for(int i=1;i<=n;i++) 14 { 15 cin>>a[i]; 16 } 17 sort(a+1,a+n+1,cmp); 18 int j=1; 19 while(s>0) 20 { 21 s-=a[j]; 22 ans++; 23 j++; 24 } 25 cout<<ans<<endl; 26 return 0; 27 }
//P1116 车厢重组
P1116 车厢重组 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//计算换了几次
//可以用冒泡排序,统计交换次数
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=10005; 5 int a[maxn],n,ans=0; 6 int main() 7 { 8 int flag=1; 9 cin>>n; 10 for(int i=1;i<=n;i++) 11 { 12 cin>>a[i]; 13 } 14 for(int i=1;i<=n&&flag==1;i++) 15 { 16 flag=0; 17 for(int j=1;j<=n-1;j++) 18 { 19 if(a[j]>a[j+1]) 20 { 21 flag=1; 22 swap(a[j],a[j+1]); 23 ans++; 24 } 25 } 26 } 27 cout<<ans<<endl; 28 return 0; 29 }
//P1152 欢乐的跳
P1152 欢乐的跳 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//注意题目中说的是连续两个元素,那差值只有n-1个
//求出所有差值,排序后,和[1,n-1]作比较就可以了
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=1010; 5 int n,a[maxn],b[maxn]; 6 int main() 7 { 8 cin>>n; 9 for(int i=1;i<=n;i++) 10 { 11 cin>>a[i]; 12 } 13 for(int i=1;i<=n-1;i++) 14 { 15 b[i]=abs(a[i]-a[i+1]); 16 } 17 sort(b+1,b+n); 18 for(int i=1;i<=n-1;i++) 19 { 20 if(b[i]-i!=0) 21 { 22 cout<<"Not jolly"<<endl; 23 return 0; 24 } 25 } 26 cout<<"Jolly"<<endl; 27 return 0; 28 }
//P1068 [NOIP2009 普及组] 分数线划定
P1068 [NOIP2009 普及组] 分数线划定 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=5005; 5 int n,m,s,k; 6 struct node 7 { 8 int num; 9 int s; 10 }a[maxn]; 11 bool cmp(node x,node y) 12 { 13 if(x.s!=y.s) return x.s>y.s; 14 else return x.num<y.num; 15 } 16 int main() 17 { 18 cin>>n>>m; 19 for(int i=1;i<=n;i++) 20 { 21 cin>>a[i].num; 22 cin>>a[i].s; 23 } 24 sort(a+1,a+n+1,cmp); 25 k=(int)(m*1.5); 26 s=a[k].s; 27 for(int i=k+1;i<=n;i++) 28 { 29 if(a[i].s==s) 30 k++; 31 else 32 break; 33 } 34 cout<<s<<" "<<k<<endl; 35 for(int i=1;i<=k;i++) 36 { 37 cout<<a[i].num<<" "<<a[i].s<<endl; 38 } 39 return 0; 40 }
总之,今天的题目都是关于排序,补充了快排的模板和stl的两个函数:nth_element(第k大/小),unique(去掉重复元素)
题目整体难度也比较简单
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了