CODEFORCES-1077c
Posted tombraider-shadow
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CODEFORCES-1077c相关的知识,希望对你有一定的参考价值。
Good Array
题目链接:https://vjudge.net/problem/CodeForces-1077C
题目大意:给你n个数组成的序列,如果从中删除一个数后,其余的n-1个数组成der序列满足其中一个数
等于其余数der和,求满足条件的数的位置
题目思路:n-1个数组成的序列,设这个和值为a n-1个数der和就是 2*a,也就是说除去删除der那个数剩下的
的和能被2整除,并且这n-1个数中存在值为a的数。也就是说我们需要先求的n个数的和,并且标记每一个数出现的次数
在遍历一遍每一个值,如果sum-a[i]能被2整除并且vis[(sum-a[i])/2]为真值,就记录这个位置i。代码如下:
#include<iostream> #include<string.h> #include<algorithm> using namespace std; const int maxn=2e5+10; const int maxns=1e6+10; int dp[6]; int vis[maxns]; int a[maxn]; int main() int n; cin>>n; long long sum=0; int maxx=-1; for(int i=1;i<=n;i++) cin>>a[i]; maxx=max(maxx,a[i]); vis[a[i]]++; sum+=a[i]; int cnt=0; int ans[maxn]; for(int i=1;i<=n;i++) if((sum-a[i])%2==0) long long flag=(sum-a[i])/2; if(flag>maxx) continue; vis[a[i]]--; //a[i]被删除自然要-1; if(vis[flag]) ans[++cnt]=i; vis[a[i]]++; //恢复原序列 cout<<cnt<<endl; for(int i=1;i<=cnt;i++) cout<<ans[i]<<(i==cnt?‘\n‘:‘ ‘); return 0;
以上是关于CODEFORCES-1077c的主要内容,如果未能解决你的问题,请参考以下文章
codeforces 1077D Cutting Out 二分
Codeforces 1077(F1+F2) DP 单调队列
Codeforces 1077F1 Pictures with Kittens (easy version)(DP)
codeforces 1077F2. Pictures with Kittens (hard version)单调队列+dp