欢迎来到起遇信息学
起遇信息学正处于上线筹建阶段,以下功能已全部开放免费体验: ✅ 完整题库浏览与代码提交评测(C / C++ / Python / Java 等) ✅ 入门到进阶的系列课程试读、作业与考试 ✅ AI 提示、AI 作业分析等智能助教功能 ✅ 赛事模拟与个人能力报告 ✅ 邮箱注册开放 ⏳ 付费课程订阅与微信/支付宝支付通道 ⏳ 手机号登录,微信扫码登录、微信公众号绑定 使用中如遇任何问题,欢迎通过页面底部 **"联系我们"** 与我们沟通。
A.Accidental Victory
Accidental Victory - 课程考试题面 - QY code 题意:每场比赛就是把两个人的筹码合并,赢的人拿走全部。最终冠军就是最后持有全部筹码的 筹码只会增加不会减少,所以一旦某个人筹码比另一个人多,多的那个永远不会因为输而失去筹码(他只会赢) 思路:对于任意一个选手,如果他前面所有人的筹码总和>=他的筹码,那么他有可能被前面的人合起来打败。 反之,如果他的筹码>前面所有人的筹码总和,那么前面所有人加起来都打不过他,他一定能赢过前面所有人。 步骤:1.把选手按筹码从小到大排序同时记住原始编号 2.计算前缀和sum[i]=前i个人的筹码总和 3.从后往前扫描找第一个满足sum[i-1]<a[i]的位置p 4.从 p 到 n 的所有选手都有可能赢 5.输出这些选手的原始编号(升序) #include<bits/stdc++.h>
using namespace std;
struct zx{
long long x;
int y;
}a[200010];
long long s[200010];
int b(zx p,zx q){
return p.x<q.x;
}
int main(){
int t;
cin>>t;
while(t--){
int n,p=1;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a\[i\].x;
a\[i\].y=i;
}
sort(a+1,a+n+1,b);
s\[0\]=0;
for(int i=1;i<=n;i++) s\[i\]=s\[i-1\]+a\[i\].x;
for(int i=n;i>=1;i--){
if(i>1&&s\[i-1\]<a\[i\].x){
p=i;
break;
}
}
vector<int>v;
for(int i=p;i<=n;i++) v.push\_back(a\[i\].y);
sort(v.begin(),v.end());
cout<<v.size()<<"\\n";
for(int i=0;i<v.size();i++) cout<<v\[i\]<<" ";
cout<<"\\n";
}
return 0;
}
B.Two TVs
0 条评论
目前还没有评论...
Be the first to comment!