求助:这个解题思路为什么错误?

题目完美的数组:
一个数组被称为完美的,当且仅当其中存在一个元素,它的值是除了它之外剩下的所有元素的和。
我现在获得了一个数组,想去掉数组中的一个元素,使得这个数组变成完美的。
我想知道这个数组有几种方案可以变成完美的。当去掉的元素在原数组中的位置不同时,即为不同的方案。
输入格式
输入的第一行包含一个整数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;
}
posted @ 2024-10-18 14:07  Danlis  阅读(2)  评论(0编辑  收藏  举报