codeforce Round#521 C. Good Array
小Z用C++寫了這個題解 順便說了一丟丟C++的vector
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Let's call an array good if there is an element in the array that equals to the sum of all other elements. For example, the array a=[1,3,3,7]a=[1,3,3,7] is good because there is the element a4=7a4=7 which equals to the sum 1+3+31+3+3.
You are given an array aa consisting of nn integers. Your task is to print all indices jj of this array such that after removing the jj-th element from the array it will be good (let's call such indices nice).
For example, if a=[8,3,5,2]a=[8,3,5,2], the nice indices are 11 and 44:
- if you remove a1a1, the array will look like [3,5,2][3,5,2] and it is good;
- if you remove a4a4, the array will look like [8,3,5][8,3,5] and it is good.
You have to consider all removals independently, i. e. remove the element, check if the resulting array is good, and return the element into the array.
Input
The first line of the input contains one integer nn (2≤n≤2⋅1052≤n≤2⋅105) — the number of elements in the array aa.
The second line of the input contains nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤1061≤ai≤106) — elements of the array aa.
Output
In the first line print one integer kk — the number of indices jj of the array aa such that after removing the jj-th element from the array it will be good (i.e. print the number of the nice indices).
In the second line print kk distinct integers j1,j2,…,jkj1,j2,…,jk in any order — nice indices of the array aa.
If there are no such indices in the array aa, just print 00 in the first line and leave the second line empty or do not print it at all.
Examples
input
Copy
5 2 5 1 2 2
output
Copy
3 4 1 5
input
Copy
4 8 3 5 2
output
Copy
2 1 4
input
Copy
5 2 1 2 4 3
output
Copy
0
Note
In the first example you can remove any element with the value 22 so the array will look like [5,1,2,2][5,1,2,2]. The sum of this array is 1010 and there is an element equals to the sum of remaining elements (5=1+2+25=1+2+2).
In the second example you can remove 88 so the array will look like [3,5,2][3,5,2]. The sum of this array is 1010 and there is an element equals to the sum of remaining elements (5=3+25=3+2). You can also remove 22 so the array will look like [8,3,5][8,3,5]. The sum of this array is 1616and there is an element equals to the sum of remaining elements (8=3+58=3+5).
In the third example you cannot make the given array good by removing exactly one element.
題意:給你n個數,讓你刪除一個數,使得剩下的(n-1)個數中有一個數等於其他的(n-2)個數之和
分析:有兩種可能:
剩下的那個數為最大數,從n-1刪除查詢
刪除最大數,剩下那個數為第二大的數,剩下的數是否等於第二大的數
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=200005;
typedef long long I64;
int n,m;
int a[N];
vector<int>ans;//建立vector物件
int main()
{
int n;
scanf("%d",&n);
I64 sum=0;
int maxx=0;
int pos=0;//記錄下標
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
if(a[i]>maxx)
{
maxx=a[i];
pos=i;
}
}
sum-=maxx;//除去最大值之外的所有數的和
int max1=0;
for(int i=1;i<=n;i++)
{
if(pos!=i)
{
max1=max(max1,a[i]);
if(sum-a[i]==maxx)
{
// cout<<sum-a[i]<<i<<endl;
ans.push_back(i);//push_back 是演算法語言裡面的一個 函式名。
//C++ 中的vector標頭檔案裡面就有這個push_back函式,在vector類中作用為在vector尾部加入一個數據。string中也有這個函式,作用是字串之後插入一個字元。
//用法例如:
//string name;
//name.push_back("XiaoMing");
}
}
}
if(sum-max1==max1)
{
ans.push_back(pos);
}
cout<<ans.size()<<endl;
for(int k=0;k<ans.size();k++)
{
printf("%d ",ans[k]);
}
return 0;
}