求助:这个解题思路为什么错误?
题目完美的数组:
一个数组被称为完美的,当且仅当其中存在一个元素,它的值是除了它之外剩下的所有元素的和。
我现在获得了一个数组,想去掉数组中的一个元素,使得这个数组变成完美的。
我想知道这个数组有几种方案可以变成完美的。当去掉的元素在原数组中的位置不同时,即为不同的方案。
输入格式
输入的第一行包含一个整数n(2 ≤n ≤ 2x 10^5)。
输入的第二行包括 n 个整数,为小黑获得的数组里面的每个元素 a(2 < ai < 10^6)。
输出格式
输出有两行。
第一行是方案的个数上。第二行有上 个用单个空格分开的整数,分别表示去掉的元素在原数组中的位置(按照输入的顺序)
说明:如果没有方案,输出一个0即可。
样例输入 1
5
2 5 1 2 2
样例输出 1
3
1 4 5
样例输入 2
4
8 3 5 2
样例输出 2
2
1 4
我的方案:
一组数,求出总和sum,遍历去除每个数后a,实际上就是b+c,那么只要判断这个b+c=2*b的b是否存在就可以了。
这里还需要排除掉万一刚好b实际上是a的情况。
我的代码:
#include<bits/stdc++.h>
using namespace std;
int f[1000005], a[100005];
int main(){
int n;
cin >> n;
long long sum=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
f[a[i]]++;
sum+=a[i];
}
int cnt=0;
vector<int> vec;
for(int i=0;i<n;i++){
long long temp=sum-a[i];
if(temp%2==0&&f[temp/2]){
if(a[i]!=temp/2){
vec.push_back(i+1);
cnt++;
}else if(f[temp/2]>1){
vec.push_back(i+1);
cnt++;
}
}
}
printf("%d\n", cnt);
for(int i=0;i<vec.size();i++){
printf("%d ", vec[i]);
}
return 0;
}
参考代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 9;
int f[N], a[N];
vector<int> v;
int main() {
int n, ma = -1;
long long sum = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> f[i];
a[i] = f[i];
sum += f[i];
}
sort(f, f + n);
for (int i = 0; i < n; i++) {
if (a[i] == f[n - 1]) {
if (sum - a[i] - f[n - 2] == f[n - 2]) {
v.push_back(i + 1);
}
} else {
if (sum - a[i] - f[n - 1] == f[n - 1]) {
v.push_back(i + 1);
}
}
}
cout << v.size() << endl;
for (int i = 0; i < v.size(); i++) {
if (i == v.size() - 1) {
cout << v[i] << endl;
} else {
cout << v[i] << ' ';
}
}
return 0;
}
fighting