1055 The World's Richest
阿新 • • 發佈:2018-11-22
題目大意:
按照財富>年齡>名字字典序的優先順序排序,然後查詢在某一個年齡段內前M名的榜單。
解題思路:
難點在於查詢的處理,我暴力寫了一發在第二個測試點成功超時了,參考了PAT筆記,首先根據每次查詢人數不會超過100對總體進行一個預處理,即把每個年齡的前100名放到另一個結構體中,這樣只需要對總體進行一次排序,然後迴圈在新的結構體中查詢即可。
程式碼如下:
#include<iostream> #include<cstdio> #include<fstream> #include<set> #include<cmath> #include<cstring> #include<string> #include<map> #include<vector> #include<iomanip> #include<cstdlib> #include<list> #include<queue> #include<stack> #include<algorithm> #define inf 0x3f3f3f3f #define MOD 1000000007 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define meminf(a) memset(a,inf,sizeof(a)) //vector ::iterator it; //set<int>::iterator iter; typedef long long ll; typedef unsigned long long ull; using namespace std; int n,m,book[210];//標記年齡人數 struct rich { char name[15]; int age,wealth; }r[100100],t[100100]; int cmp(rich a,rich b) { if(a.wealth==b.wealth) { if(a.age==b.age)return strcmp(a.name,b.name)<0; else return a.age<b.age; } else return a.wealth>b.wealth; } int main() { // std::ios::sync_with_stdio(false); // cin.tie(0); // freopen("test.txt","r",stdin); // freopen("output.txt","w",stdout); scanf("%d %d",&n,&m); for(int i=0;i<n;i++) scanf("%s %d %d",&r[i].name,&r[i].age,&r[i].wealth); sort(r,r+n,cmp); int len=0; for(int i=0;i<n;i++) { if(book[r[i].age]<=100)//把每個年齡的前100放入 { book[r[i].age]++; t[len++]=r[i]; } } for(int j=1;j<=m;j++) { int num,k1,k2,sum=0; scanf("%d %d %d",&num,&k1,&k2); printf("Case #%d:\n",j); for(int i=0;i<len&&sum<num;i++) { if(t[i].age>=k1&&t[i].age<=k2)//迴圈查詢 { sum++; printf("%s %d %d\n",t[i].name,t[i].age,t[i].wealth); } } if(sum==0)printf("None\n"); // cout<<loc1<<' '<<loc2<<endl; } return 0; }