前言:
在家颓废了快一个星期了,在家里是真难有学习动力呀。希望自己能更加自律吧。
正文:
Problem:A 谁考了第k名-排序:
#include<bits/stdc++.h>
using namespace std;
typedef struct stu{
int xh;
double cj;
}stu;
bool cmp1(stu a,stu b){
return a.cj>b.cj;
}
int main(){
int n,k;
stu a[109];
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i].xh>>a[i].cj;
}
sort(a+1,a+1+n,cmp1);
cout<<a[k].xh<<" "<<a[k].cj;
return 0;
}
这里用到了结构体排序与cmp函数,在这里简单介绍一下。结构体可以帮助我们将排序结果与其他相关属性关联起来。例如这题中的输出第k名学生的学号和成绩,我们可以将成绩和学号用结构体来关联起来再对结构体进行排序,就可以按成绩高低来输出各自的学号。这其中还需要运用cmp函数来定义sort函数的排序规则,通过返回值的真假来规定规则。具体用法见上述代码,下面的题目中也会经常用到。
Problem:B 奇数单增序列:
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> a;
int n,x;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
if(x%2)a.push_back(x);
}
sort(a.begin(),a.end());
for(vector<int>::iterator it=a.begin();it!=a.end();++it){
if(it<a.end()-1)cout<<*it<<",";
else cout<<*it;
}
return 0;
}
这里我用了vector,其实可以不这么麻烦开一个大于500的数组就行。vector的好处在于他的大小是动态的,这样就可以不用管N是多少了。遍历数组的时候记得排除偶数。
Problem:C 成绩排序:
#include<bits/stdc++.h>
using namespace std;
int main(){
double a[12];
while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9]>>a[10]){
sort(a+1,a+11,greater<double>());
for(int i=1;i<=10;i++){
if(i<10)printf("%.2lf ",a[i]);
else printf("%.2lf\n",a[i]);
}
}
return 0;
}
sort默认升序排序,要想改变规则需要自己定义一个cmp函数或用greater<...>()来降序排序。
Problem:D 没必要的排序1
#include<bits/stdc++.h>
using namespace std;
int a[1009];
int main(){
int n,k,ans=0;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n,greater<int>());
for(int i=1;i<=k;i++){
ans+=a[i];
}
cout<<ans;
}
降序排序后将前k大的数加和。
Problem:E 没必要的排序2
#include<bits/stdc++.h>
using namespace std;
int a[100000];
int main(){
int n,k,x,ans=0,cnt=0;
ios::sync_with_stdio(false);
cin>>n>>k;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
cin>>x;
a[x]++;
}
for(int i=100000;i>=1;i--){
for(int j=1;j<=a[i];j++){
ans+=i;
cnt++;
if(cnt==k)break;
}
if(cnt==k)break;
}
cout<<ans;
return 0;
}
因为每个数最大不超过10000,用桶排序会方便很多,但也一定要取消同步流,不然会超时。
Problem:F 老和尚的导员:
#include<bits/stdc++.h>
using namespace std;
int a[109],b[109],c[109],d[109];
typedef struct stu{
int xh,cj;
int a,b,c,d;
}stu;
stu t[109];
bool cmp1(stu x,stu y){
if(x.cj!=y.cj)
return x.cj>y.cj;
else if(x.a!=y.a)
return x.a>y.a;
else if(x.b!=y.b)
return x.b>y.b;
else if(x.c!=y.c)
return x.c>y.c;
else return x.d>y.d;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
memset(t,0,sizeof(t));
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i]>>d[i];
t[i].cj=a[i]+b[i]+c[i]+d[i];
t[i].xh=i;
t[i].a=a[i];
t[i].b=b[i];
t[i].c=c[i];
t[i].d=d[i];
}
sort(t+1,t+1+n,cmp1);
for(int i=1;i<=n;i++){
cout<<t[i].xh<<" "<<t[i].cj<<endl;
}}
return 0;
}
结构体中的变量更多,cmp函数的规则也更复杂,不过万变不离其宗,依旧是一道普通的排序题。
Problem:G 健忘的老和尚:
#include<bits/stdc++.h>
using namespace std;
typedef struct stu{
string name;
int cj;
}stu;
stu t[109];
bool cmp1(stu a,stu b){
return a.cj<b.cj;
}
int main(){
int n;
while(scanf("%d",&n)!=-1){
int x,y;
cin>>x>>y;
for(int i=1;i<=n;i++){
cin>>t[i].name>>t[i].cj;
}
sort(t+1,t+n+1,cmp1);
for(int i=n-x+1;i<=n;i++){
cout<<t[i].name<<endl;
}
for(int i=1;i<=y;i++){
cout<<t[i].name<<endl;
}
}
return 0;
}
注意排序后两个输出的都要求升序输出,调整for循环即可。
Problem:H 戏说三国:
#include <bits/stdc++.h>
using namespace std;
typedef struct stu{
double zy,wy,dy,total;
string name;
}stu;
stu wj[10009];
bool cmp1(stu x,stu y){
if(x.total!=y.total) return x.total>y.total;
else if(x.zy!=y.zy) return x.zy>y.zy;
else if(x.dy!=y.dy) return x.dy>y.dy;
else if(x.wy!=y.wy) return x.wy>y.wy;
}
int main(){
int t;
cin>>t;
for(int i=1;i<=t;i++){
int n;
double a,b,c;
cin>>n>>a>>b>>c;
a/=100;b/=100;c/=100;
for(int o=1;o<=n;o++){
cin>>wj[o].name>>wj[o].zy>>wj[o].dy>>wj[o].wy;
wj[o].total=wj[o].zy*b+wj[o].dy*a+wj[o].wy*c;
}
sort(wj+1,wj+n+1,cmp1);
printf("Case #%d:\n",i);
for(int p=1;p<=n;p++){
cout<<wj[p].name<<" ";
printf("%.4lf %.4lf %.4lf %.4lf\n",wj[p].total,wj[p].zy*b,wj[p].dy*a,wj[p].wy*c);
}
}
return 0;
}
题目挺正常的,就是挖了一个大坑,总成绩是按b,a,c的比率计算的,别搞错为a,b,c了,我也掉进坑了,WA了好多次才发现,以后读题一定要认真了。
Problem:I 相约摩洛哥:
Problem:J 结构体排序题一:
#include<bits/stdc++.h>
using namespace std;
typedef struct stu
{
char name[10];
int t1,t2,t3;
int s1,s2,s3;
int sumtime;
int actime;
}stu;
stu acm[100000];
bool cmp(stu a,stu b)
{
if(a.actime==b.actime)
return a.sumtime<b.sumtime;
return a.actime>b.actime;
}
int main (void)
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
cin>>acm[i].name>>acm[i].t1>>acm[i].t2>>acm[i].t3;
}
for(i=0;i<n;i++)
{
cin>>acm[i].s1>>acm[i].s2>>acm[i].s3;
acm[i].actime=0;acm[i].sumtime=0;
}
for(i=0;i<n;i++)
{
if(acm[i].t1!=-1)acm[i].actime+=1;
if(acm[i].t2!=-1)acm[i].actime+=1;
if(acm[i].t3!=-1)acm[i].actime+=1;
}
for(i=0;i<n;i++)
{
if(acm[i].t1!=-1){acm[i].sumtime+=acm[i].t1+((acm[i].s1-1)*20);}
if(acm[i].t2!=-1){acm[i].sumtime+=acm[i].t2+((acm[i].s2-1)*20);}
if(acm[i].t3!=-1){acm[i].sumtime+=acm[i].t3+((acm[i].s3-1)*20);}
}
sort(acm,acm+n,cmp);
for(j=0;j<n;j++)
{
cout<<acm[j].name<<" "<<acm[j].actime<<" "<<acm[j].sumtime<<endl;
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef struct stu{
int x;
int y;
}stu;
stu a[100];
bool cmp00(stu a,stu b){
if(a.x==b.x) return a.y>b.y;
return a.x>b.x;
}
bool cmp01(stu a,stu b){
if(a.x==b.x) return a.y<b.y;
return a.x>b.x;
}
bool cmp11(stu a,stu b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
bool cmp10(stu a,stu b){
if(a.x==b.x) return a.y>b.y;
return a.x<b.x;
}
int main(){
int o,p,n;
while(cin>>o>>p>>n){
for(int i =1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
if(o==0){
if(p==0)sort(a+1,a+n+1,cmp00);
else sort(a+1,a+n+1,cmp01);
}
else{
if(p==0)sort(a+1,a+n+1,cmp10);
else sort(a+1,a+n+1,cmp11);
}
for(int i=1;i<=n;i++){
cout<<"("<<a[i].x<<","<<a[i].y<<")"<<endl;
}
}
return 0;
}
多定义几个cmp并按不同需求使用即可。
后记:
希望我在家也别懈怠学习啊。