“Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)A--A Simple Problem about election(模拟)
地址:https://ac.nowcoder.com/acm/contest/5523/A
题意:刚开始没读懂。。。题意就是给出n个人,每个人m张票。第一个数是本人得的票数。除了本人以外,所有人都投过了票,现在他要把m张票投完,怎么投才能使自己的排名更靠前。由于他的名字关系,同样的票数,他要排在最后。
解析:先投给自己一张(规定了只能投自己一票)。然后先投比他大的,因为比他大的票数再多,也影响不到自己的排名了。投完比他大的,如果还有余票,投比他小的而且和他差值>1的,这样也不会影响到他的排名。最后如果还有余票,就投给比他少而且差值<=1的了。投完了排个序,找到第一个等于本人票数的位置输出即可。
#include<iostream> #include<cstring> #include<map> #include<cstdlib> #include<algorithm> #include<set> using namespace std; typedef long long ll; const int maxn=1e5+5; ll a[maxn]; int main() { int t; cin>>t; while(t--) { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; a[1]++; int md=a[1]; int ans=m-1; for(int i=2;i<=n;i++) { if(ans==0) break; if((a[i]>=md)) { a[i]++; ans--; } } if(ans>0) { for(int i=2;i<=n;i++) { if(ans==0) break; if(md-a[i]>1) { a[i]++; ans--; } } if(ans>0) { for(int i=2;i<=n;i++) { if((a[i]<md)&&(md-a[i])<=1) { a[i]++; ans--; }if(ans==0) break; } } } sort(a+1,a+1+n); for(int i=1;i<=n;i++) { if(a[i]==md) { cout<<n-i+1<<endl;break; } } } }