三国游戏
// #include <iostream>
// using namespace std;
// #define N 100010
// int a[N];
// int b[N];
// int c[N];
// int a_sum[N];
// int b_sum[N];
// int c_sum[N];
// int main()
// {
// int n;
// cin >> n;
// int flat = 0;
// int cnt = 0;
// for (int i = 0; i < n; i++)
// {
// cin >> a[i];
// }
// for (int i = 0; i < n; i++)
// {
// cin >> b[i];
// }
// for (int i = 0; i < n; i++)
// {
// cin >> c[i];
// }
// for (int i = 1; i < n; i++)
// {
// a_sum[0]=a[0]; b_sum[0]=a[0]; b_sum[0]=a[0];
// a_sum[i] = a_sum[i - 1] + a[i];
// b_sum[i] = b_sum[i - 1] + b[i];
// c_sum[i] = c_sum[i - 1] + c[i];
// if ((a_sum[i] + b_sum[i] > c_sum[i]) || (c_sum[i] + b_sum[i] > a_sum[i]) || (a_sum[i] + c_sum[i] > b_sum[i]))
// {
// flat = 1;
// cnt = i;
// }
// }
// if (flat)
// cout << cnt;
// else
// cout << "-1";
// return 0;
// }
// #include<bits/stdc++.h>
// using namespace std;
// typedef long long LL;
// const int N = 1e5 + 10;
// int a[N], b[N], c[N], w[N];
// int n;
// int work(int x[], int y[], int z[]) //返回使得x获胜的多事件
// {
// for(int i=1;i<n + 1;i++)
// w[i] = x[i] - y[i] - z[i]; //使得x国胜利,第i个事件的贡献度为w[i]
// sort(w + 1, w + 1 + n, greater<int>()); //降序排列
// LL sum = 0;
// int idx = -1;
// for(int i=1;i<n + 1;i++)
// {
// sum += w[i];
// if(sum > 0) //严格大于的时候才可以获胜
// idx = i; //记录最大事件
// else // <=0的时候,不能获胜,接着遍历sum只会更小,break即可
// break;
// }
// return idx;
// }
// int main()
// {
// scanf("%d", &n);
// for(int i=1;i<n + 1;i++)
// scanf("%d", &a[i]);
// for(int i=1;i<n + 1;i++)
// scanf("%d", &b[i]);
// for(int i=1;i<n + 1;i++)
// scanf("%d", &c[i]);
// int res = -1;
// res = max(work(a, b, c), max(work(b, a, c), work(c, a, b)));
// cout << res << endl;
// return 0;
// }
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int a[N], b[N], c[N], h[N];
int n;
int work(int x[], int y[], int z[]) //返回使得x获胜的多事件
{
for(int i=1;i<n + 1;i++)
h[i] = x[i] - y[i] - z[i]; //先算出来每一个独立事件发生的时候,该值的正负。
sort(h + 1, h + 1 + n, greater<int>()); //把它们降序排列出来,这样的话就可以按照
LL sum = 0;
int idx = -1;
for(int i=1;i<n + 1;i++)
{
sum +=h[i];
if(sum > 0)
idx = i; //记录最大会发生的事件
else//<=0的时候是不可能获胜的,因为贡献值是逐渐变小的
break;
}
return idx;
}
int main()
{
cin>>n;
for(int i=1;i<n + 1;i++)
scanf("%d", &a[i]);
for(int i=1;i<n + 1;i++)
scanf("%d", &b[i]);
for(int i=1;i<n + 1;i++)
scanf("%d", &c[i]);
int res = -1;//如果没有的话,那么输出还是-1
res = max(work(a, b, c), max(work(b, a, c), work(c, a, b)));
cout << res << endl;
return 0;
}
错误票据
输入的时候有这样一种方法
while (line--) {
while (cin >> a) {
//判断条件
//将h[a]加一,记录他出现的次数
}
如果次数大于1,就是重复ID
如果次数小于1,就是遗漏ID