原题链接AcWing 4965. 三国游戏 https://www.acwing.com/problem/content/description/4968/
算法标签:枚举、贪心
分析思路:
由题目可知,要像一方胜利就要满足X>Y+Z=>X-Y-Z>0=>s=a[i]-b[i]-c[i],且需要最多发生的事件,由此可知枚举算出s的值,然后从大到小排序,直到计算到s=0即是最多事件的情况!
代码实现:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=100010;
int a[N],b[N],c[N],w[N];
LL n;
int make(int x[],int y[],int z[])
{
for(int i=0;i<n;i++)
{
w[i]=x[i]-y[i]-z[i];
}
sort(w,w+n,greater<int>());
int res=-1;
LL sum=0;
for(int i=0;i<n;i++)
{
sum+=w[i];
if(sum>0) res=i+1;
else break;
}
return res;
}
int main()
{
scanf("%lld",&n);
for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
for (int i = 0; i < n; i ++ ) scanf("%d", &b[i]);
for (int i = 0; i < n; i ++ ) scanf("%d", &c[i]);
int count=max({make(a,b,c),make(b,a,c),make(c,a,b)});
cout<<count<<endl;
return 0;
}