30分,不知道哪里出了问题

P2141 [NOIP2014 普及组] 珠心算测验

@[Lruler](/user/570537) 不理解你这段代码在干嘛 ```cpp for(int i = 2; i <= n; i++){ if(a[i]<a[i-1]){ a[0] = a[i]; a[i] = a[i-1]; for(j = i-2; a[0] < a[j]; j--){ a[j+1] = a[j]; } a[j+1] = a[0]; } } ```
by sundyLIUXY @ 2023-01-24 17:56:11


这题要判重,题解中也说了 >1+4=5与2+3=5是一种不是两种
by sundyLIUXY @ 2023-01-24 17:57:37


@[sundyLIUXY](/user/706737) 我那一段是排个序,就是为了下面方便排重的
by Lruler @ 2023-01-25 21:58:23


@[Lruler](/user/570537) 下了一组数据,中间数据输出,您的代码并没有判重,发现您前面的那块是排序,不代表是判重 ``` 5 10 4 6 2 8 ``` 这组数据,您的程序的中间数据是这样的 ``` 2+8 = 10 4+6 = 10 2+6 = 8 2+4 = 6 ``` 很明显没有判重,仅仅排序并依次-1枚举并不能判重。其实应该开个bool数组,在后面枚举的if里,一旦满足条件,就标记。 排序不用删,但也可以删,删了就会短很多 两份代码,这是不删排序的(稍长): ```cpp #include<bits/stdc++.h> using namespace std; int a[110], n, cnt; bool vis[10010]; //bool数组判重 int main() { cin >> n; for(int i = 1; i <= n; i++) cin>>a[i]; int j; for(int i = 2; i <= n; i++){ if(a[i]<a[i-1]){ a[0] = a[i]; a[i] = a[i-1]; for(j = i-2; a[0] < a[j]; j--){ a[j+1] = a[j]; } a[j+1] = a[0]; } } for(int i = n; i >= 1; i--) { for(int j = i-1; j >= 1; j--) { for(int k = j-1; k >= 1; k--) { if(a[i]==a[j]+a[k] && !vis[a[i]]) cnt++, vis[a[i]] = 1; //标记,标记过的就不会再重复记入答案 } } } cout<<cnt; return 0; } ``` 这是删排序的: ```cpp #include<bits/stdc++.h> using namespace std; int a[110], n, cnt; bool vis[10010]; int main() { cin >> n; for(int i = 1; i <= n; i++) cin>>a[i]; for(int i = n; i >= 1; i--) { //不排序,那么枚举顺序不限,n到1,1到n都行 for(int j = n; j >= 1; j--) { for(int k = n; k >= 1; k--) { if(a[i]==a[j]+a[k] && !vis[a[i]] && a[i] != a[j] && a[j] != a[k] && a[k] != a[i]) cnt++, vis[a[i]] = 1; //因为删掉了排序,必须从1到n全枚举,但又得判断三个数是否一样 } } } cout << cnt; return 0; } ```
by sundyLIUXY @ 2023-01-26 11:40:00


@[sundyLIUXY](/user/706737) 哦哦,懂了懂了,谢谢大佬
by Lruler @ 2023-01-27 10:37:50


|