Day4总结

· 2026-7-13 16:44:20

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&lt;q.x;

}

int main(){

int t;

cin&gt;&gt;t;

while(t--){

	int n,p=1;

	cin&gt;&gt;n;

	for(int i=1;i&lt;=n;i++){

		cin&gt;&gt;a\[i\].x;

		a\[i\].y=i;

	}

	sort(a+1,a+n+1,b);

	s\[0\]=0;

	for(int i=1;i&lt;=n;i++) s\[i\]=s\[i-1\]+a\[i\].x;

	for(int i=n;i&gt;=1;i--){

		if(i&gt;1&amp;&amp;s\[i-1\]&lt;a\[i\].x){

			p=i;

			break;

		}

	}

	vector&lt;int&gt;v;

	for(int i=p;i&lt;=n;i++) v.push\_back(a\[i\].y);

	sort(v.begin(),v.end());

	cout&lt;&lt;v.size()&lt;&lt;"\\n";

	for(int i=0;i&lt;v.size();i++) cout&lt;&lt;v\[i\]&lt;&lt;" ";

	cout&lt;&lt;"\\n";

}

return 0;

}

B.Two TVs

5 次查看 举报

0 条评论

目前还没有评论...

Be the first to comment!

返回讨论列表
高士渠
95
通过题目
11
发帖数