链接:https://www.nowcoder.com/acm/contest/84/B
看到这道题目完全没有任何思路,从来没见到过这种题
看着别人一个个的AC 自己心里还挺不是滋味的~
看过别人博客的详解才明白
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 5 // 别人的思路 贴过来 6 /* 7 *思路:考虑三个序列: 8 *1.输入的序列a 9 *2.通过调整a最少次数得到正确的序列b 10 *3.任意一个正确的辅助序列c 11 */ 12 13 int arr[100005]; // 输入的序列a 14 int f[100005]; // 辅助序列c 15 // 开一个下标可以为负数的数组 16 int data[200010] = {0}; // 分类并计数 17 int *cnt = data+100005; // 很精妙 用指针实现下标可以为负数的数组 18 int main() 19 { 20 int n,ans = 0; 21 cin >> n; 22 // 输入 23 for(int i = 0;i < n;++i) scanf("%d",&arr[i]); 24 // 生成任意一个正确序列,保存在f中 25 // 这里设置为{1,2,3,4,~~~,4,3,2,1}; 26 f[0] = f[n-1] = 1; 27 for(int i = 1;i <= n-1-i;++i) f[i] = f[n-i-1] = 1+i; 28 // 根据差值来分类并计数 29 for(int i = 0;i < n;++i) cnt[f[i]-arr[i]]++; 30 ans = n; 31 for(int i = -100000;i <= 100000;++i) 32 { 33 if(ans > n-cnt[i]) 34 ans = n-cnt[i]; 35 // ans = min(ans,n-cnt[i]); 36 } 37 // 输出结果 38 printf("%d ",ans); 39 return 0; 40 }
虽然现在是看明白了 但是还是讲不出来
自己实在是太菜了