大一寒假訓練二(排序)
阿新 • • 發佈:2019-01-08
大一寒假訓練二(排序初級版)
#include <bits/stdc++.h>
using namespace std;
struct student
{
int a;
double b;
};
int main()
{
student stu[1001],t;
int i,j,n,k;
while(scanf("%d%d",&n,&k)!=-1)
{
for(i=1;i<=n;i++)
scanf("%d%lf",&stu[ i].a,&stu[i].b);
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if(stu[j].b>stu[i].b)
{
t=stu[i];
stu[i]=stu[j];
stu[j]=t;
}
}
}
printf("%d %g\n",stu[k].a,stu[k].b);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i,a[510];
while(scanf("%d",&n)!=-1)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
{
if(a[i]%2==1)
{
if(i==1)printf("%d",a[i]);
else printf(",%d",a[i]);
}
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct student
{
char name[21];
int score;
};
bool cmp(student a,student b)
{
int t=strcmp(a.name,b.name);
if(a.score==b.score) return t<0;//t<0不能寫成t=-1
//如果a字串的字典序小於b字串的字典序,則strcmp(a,b)返回值為負數,但不一定是-1
else return a.score>b.score;
}
int main()
{
int i,n;
student stu[21];
while(scanf("%d",&n)!=-1)
{
getchar();
for(i=1;i<=n;i++)
scanf("%s%d",stu[i].name,&stu[i].score);
sort(stu+1,stu+n+1,cmp);
for(i=1;i<=n;i++)
printf("%s %d\n",stu[i].name,stu[i].score);
}
return 0;
}
大一寒假訓練二(排序)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i,a[101];
while(scanf("%d",&n)!=-1)
{
for(i=0;i<=n-1;i++)
scanf("%d",&a[i]);
sort(a,a+n);
for(i=0;i<=n-1;i++)
{
if(i==n-1) printf("%d\n",a[i]);
else printf("%d ",a[i]);
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
return abs(a)>abs(b);
}
int main()
{
int i,n,a[101];
while(scanf("%d",&n)!=-1)
{
if(n==0)break;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1,cmp);
for(i=1;i<=n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
return 0;
}
這題資料比較水,用暴力迴圈兩層都能過。
今天看了老師的桶排序方法,真是受益匪淺啊,比我之前寫的程式碼簡潔快速多了。
桶排序的模板,以後會用得到,好好記住吧!
註釋詳見程式碼~
//桶排序
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i,x,ans,t[101];//t為儲存1~100內每個數字出現次數的"桶"
while(scanf("%d",&n)!=-1)
{
memset(t,0,sizeof(t));
ans=0;//賦初值,相同數字的個數最少是0
for(i=1;i<=n;i++)
{
scanf("%d",&x);//依次輸入x
t[x]++;//如果輸入x,x對應的"桶"是t[x],把t[x]+1即可
ans=max(ans,t[x]);//每次把新得到的t[x]與之前的最大的ans比較,取max
}
printf("%d\n",ans);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct student
{
int a[5],s,k;
};
bool cmp(student m,student n)
{
if(m.s!=n.s) return m.s>n.s;//先降序排列總成績
else if(m.a[1]!=n.a[1]) return m.a[1]>n.a[1];//如果總成績相同,排序分成績1
else if(m.a[2]!=n.a[2]) return m.a[2]>n.a[2];//如果總成績、分成績1相同,排序分成績2
else if(m.a[3]!=n.a[3]) return m.a[3]>n.a[3];//如果總成績、分成績1、2相同,排序分成績3
else if(m.a[4]!=n.a[4]) return m.a[4]>n.a[4];//如果總成績、分成績1、2、3相同,排序分成績4
}
int main()
{
int i,n;
student stu[200];
while(scanf("%d",&n)!=-1)
{
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d",&stu[i].a[1],&stu[i].a[2],&stu[i].a[3],&stu[i].a[4]);
stu[i].s=stu[i].a[1]+stu[i].a[2]+stu[i].a[3]+stu[i].a[4];
stu[i].k=i;
}
sort(stu+1,stu+n+1,cmp);
for(i=1;i<=n;i++)
printf("%d %d\n",stu[i].k,stu[i].s);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct student
{
int a;
char name[101];
};
bool cmp(student m,student n)
{
return m.a<n.a;
}
int main()
{
int i,n,m,o;
student p[200];
while(scanf("%d%d%d",&n,&m,&o)!=-1)
{
for(i=1;i<=n;i++)
scanf("%s%d",&p[i].name,&p[i].a);
sort(p+1,p+n+1,cmp);
for(i=n-m+1;i<=n;i++)
printf("%s\n",p[i].name);
for(i=1;i<=o;i++)
printf("%s\n",p[i].name);
}
return 0;
}
nefu 873 戲說三國
在輸入資料和計算資料之前,把題目看清楚,不要因為沒看清題出現WA
#include <bits/stdc++.h>
using namespace std;
struct student
{
double s,x,y,z,x1,y1,z1;
char name[30];
};
bool cmp(student m,student n)
{
if(m.s!=n.s)return m.s>n.s;
else if(m.x1!=n.x1)return m.x1>n.x1;
else if(m.y1!=n.y1)return m.y1>n.y1;
else if(m.z1!=n.z1)return m.z1>n.z1;
}
student p[100001];
int main()
{
int t,n,i,I;
double a,b,c;
while(scanf("%d",&t)!=-1)
{
for(I=1;I<=t;I++)
{
scanf("%d%lf%lf%lf",&n,&a,&b,&c);
for(i=1;i<=n;i++)
{
scanf("%s%lf%lf%lf",p[i].name,&p[i].x,&p[i].y,&p[i].z);
p[i].x1=p[i].x*b*0.01;
p[i].y1=p[i].y*a*0.01;//這裡故意坑你,要把題目看清楚。題目說的是“每個官員有一個智育、德育、武育三個分數,分別以b%,a%,c%的比率”,也就是說,不是a、b、c,而是b、a、c!
p[i].z1=p[i].z*c*0.01;
p[i].s=p[i].x1+p[i].y1+p[i].z1;
}
sort(p+1,p+n+1,cmp);
printf("Case #%d:\n",I);
for(i=1;i<=n;i++)
printf("%s %.4lf %.4lf %.4lf %.4lf\n",p[i].name,p[i].s,p[i].x1,p[i].y1,p[i].z1);
}
}
return 0;
}
這好像是當天最難的題,其實不難啦
注意審題
//最後的獲勝者為正確解答題目最多且總用時最少的隊伍。
//每道試題用時將從競賽開始到試題解答被判定為正確為止,
//其間每一次提交執行結果被判錯誤的話將被加罰20分鐘時間,
//未正確解答的試題不記時!!!!!!!!!!!!!!
//比如說第一題提交10次都是錯的,但是這道題不加罰時10*20!
(好吧之前我又把題目理解錯了QAQ)
#include <bits/stdc++.h>
using namespace std;
struct student
{
char name[30];
int t[4],sub[4],tsum,subac;
};
bool cmp(student m,student n)
{
if(m.subac!=n.subac) return m.subac>n.subac;
if(m.subac==n.subac) return m.tsum<n.tsum;
}
student p[100001];
int main()
{
int n,i,j;
while(scanf("%d",&n)!=-1)
{
for(i=1;i<=n;i++)
scanf("%s%d%d%d",p[i].name,&p[i].t[1],&p[i].t[2],&p[i].t[3]);