2112 - 我要当学霸!
时间限制 : 1 秒
内存限制 : 128 MB
自从fuzhongqing来到青岛科技大学以来发现身边有很多学霸存在。不甘堕落的学渣fuzhongqing决定向学霸学习,自我提升,可是那些才是真正的学霸呢?
fuzhongqing发现学霸有一个共同特征---去图书馆借书。于是他就像图书馆管理员阿姨借来了借书表。借书表有m(1<=m<=10000)行记录了n(1<=n<=1000)个人的借书行为。每行有两个数字ai,bi 代表ai个人借了bi本书。当然如果他借书的数目不够(小于)k本就说明他是伪学霸了。不值得fuzhongqing学习!
现在弱弱的fuzhongqing跑来向会编程的你求助。让你帮他找出那些是学霸。
题目输入
第一行有一个整数T 表示有T组测试数据
接下来一行有三个整数 m n k 分别表示借书表的条目数,借书人数,学霸的最低读书标准。
接下来有m行每行有两个数字ai,bi 代表ai个人借了bi本书。(同一个人有可能借书多次)
题目输出
输出学霸的编号 如果有多个学霸 那么按照谁学霸编号升序输出 每组数组用用空格隔开 .如果没有学霸请输出0.
输入/输出样例
输入格式
2 5 4 4 1 1 2 2 3 4 2 3 4 6 4 3 9 1 5 2 6 3 7 3 1
输出格式
2 3 4 0
C语言解答
#include <stdio.h> #include <string.h> int main() { int T; scanf("%d",&T); while(T--) { int a,b,m,k,n,x=0,i,j,s1[1000],temp=0; char s[1000]; memset(s1,0,sizeof(int)*1000); scanf("%d%d%d",&m,&n,&k); while(m--) { int flag=1; scanf("%d%d",&a,&b); s1[a]+=b; if(s1[a]>=k) { for(i=0;i<x;i++) if(s[i]==a) flag=0; if(flag) s[x++]=a; } } for(i=0;i<x;i++) for(j=i+1;j<x;j++) if(s[j]<s[i]) {temp=s[j];s[j]=s[i];s[i]=temp;} for(i=0;i<x;i++) if(!i)printf("%d",s[i]);else printf(" %d",s[i]); if(!x) printf("0"); printf("\n"); } return 0; }
C++解答
#include<iostream> #include<cstring> using namespace std; int main() { int t; cin>>t; while(t--) { int m,n,key,max=0; int per[10001]; memset(per,0,sizeof(per)); cin>>m>>n>>key; while(m--) { int a,b; cin>>a>>b; per[a]+=b; if(a>max&&b>=key) max=a; } int none=1; for(n=1;n<=max;n++) { if(per[n]>=key) { none=0; if(n!=max) cout<<n<<" "; else cout<<n<<endl; } } if(none) cout<<"0"<<endl; } return 0; }