题目大意:
解决:用sort函数中不同的cmp
15MS 1212K
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=1000000; struct node { int id; int gold; int total; double goldper; double totalper; }; node nation[N]; int num[N]; bool mark[N]; int rank[N]; int kind[N]; bool cmp1(const node &a,const node &b) { return a.gold>b.gold; } bool cmp2(const node &a,const node &b) { return a.total>b.total; } bool cmp3(const node &a,const node &b) { return a.goldper>b.goldper; } bool cmp4(const node &a,const node &b) { return a.totalper>b.totalper; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int i,j; int people; memset(mark,0,sizeof(mark)); for(i=0;i<n;i++) { scanf("%d%d%d",&nation[i].gold,&nation[i].total,&people); nation[i].id=i; nation[i].goldper=(double)nation[i].gold/(double)people; nation[i].totalper=(double)nation[i].total/(double)people; } for(i=0;i<m;i++){scanf("%d",&num[i]);mark[num[i]]=1;} for(i=0,j=0;i<n;i++) if(mark[i])nation[j++]=nation[i]; sort(nation,nation+m,cmp1); int tmp=0,t=nation[0].gold; for(i=0;i<m;i++) { kind[nation[i].id]=1; if(nation[i].gold!=t ){tmp=i;t=nation[i].gold;} rank[nation[i].id]=tmp; } sort(nation,nation+m,cmp2); tmp=0;t=nation[0].total; for(i=0;i<m;i++) { if(nation[i].total!=t){tmp=i;t=nation[i].total;} if(rank[nation[i].id] > tmp) { rank[nation[i].id]= tmp ; kind[nation[i].id]=2; } } sort(nation,nation+m,cmp3); tmp=0; double tt=nation[0].goldper; for(i=0;i<m;i++) { if(nation[i].goldper!=tt){tmp=i;tt=nation[i].goldper;} if(rank[nation[i].id] > tmp) { rank[nation[i].id]= tmp ; kind[nation[i].id]=3; } } sort(nation,nation+m,cmp4); tmp=0;tt=nation[0].totalper; for(i=0;i<m;i++) { if(nation[i].totalper!=tt){tmp=i;tt=nation[i].totalper;} if(rank[nation[i].id] > tmp) { rank[nation[i].id]= tmp ; kind[nation[i].id]=4; } } for(i=0;i<m;i++) printf("%d:%d\n",rank[num[i]]+1,kind[num[i]]); printf("\n"); } // system("pause"); return 0; }
31MS 5120K #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=1000000; struct node { int id; int gold; int total; double goldper; double totalper; }; node nation[N]; int num[N]; bool mark[N]; int rank[N]; int kind[N]; bool cmp1(const node &a,const node &b) { return a.gold>b.gold; } bool cmp2(const node &a,const node &b) { return a.total>b.total; } bool cmp3(const node &a,const node &b) { return a.goldper>b.goldper; } bool cmp4(const node &a,const node &b) { return a.totalper>b.totalper; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int i,j; int people; memset(mark,0,sizeof(mark)); memset(rank,0,sizeof(rank)); for(i=0;i<n;i++) { scanf("%d%d%d",&nation[i].gold,&nation[i].total,&people); nation[i].id=i; nation[i].goldper=(double)nation[i].gold/(double)people; nation[i].totalper=(double)nation[i].total/(double)people; } for(i=0;i<m;i++){scanf("%d",&num[i]);mark[num[i]]=1;} for(i=0,j=0;i<n;i++) if(mark[i])nation[j++]=nation[i]; sort(nation,nation+m,cmp1); rank[nation[0].id]=0; kind[nation[0].id]=1; int tmp=0; for(i=1;i<m;i++) { kind[nation[i].id]=1; if(nation[i].gold!=nation[i-1].gold)tmp=i; rank[nation[i].id]=tmp; } sort(nation,nation+m,cmp2); if(rank[nation[0].id]>0) { rank[nation[0].id]=0; kind[nation[0].id]=2; } tmp=0; for(i=1;i<m;i++) { if(nation[i].total!=nation[i-1].total)tmp=i; if(rank[nation[i].id] > tmp) { rank[nation[i].id]= tmp ; kind[nation[i].id]=2; } } sort(nation,nation+m,cmp3); if(rank[nation[0].id]>0) { rank[nation[0].id]=0; kind[nation[0].id]=3; } tmp=0; for(i=1;i<m;i++) { if(nation[i].goldper!=nation[i-1].goldper)tmp=i; if(rank[nation[i].id] > tmp) { rank[nation[i].id]= tmp ; kind[nation[i].id]=3; } } sort(nation,nation+m,cmp4); if(rank[nation[0].id]>0) { rank[nation[0].id]=0; kind[nation[0].id]=4; } tmp=0; for(i=1;i<m;i++) { if(nation[i].totalper!=nation[i-1].totalper)tmp=i; if(rank[nation[i].id] > tmp) { rank[nation[i].id]= tmp ; kind[nation[i].id]=4; } } for(i=0;i<m;i++) printf("%d:%d\n",rank[num[i]]+1,kind[num[i]]); printf("\n"); } // system("pause"); return 0; }
通过这两个时空比较,我发现原来分散着写与用一个循环相比运行时间和运行的空间都不如用循环,差别很明显啊