【思维】牛客练习赛16 B-漂亮的树

链接: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\n",ans);
39     return 0;
40 }

虽然现在是看明白了 但是还是讲不出来
自己实在是太菜了  

猜你喜欢

转载自www.cnblogs.com/duny31030/p/8969417.html
今日推荐