Aiiage Camp Day4 C KTV
阿新 • • 發佈:2018-02-23
amp 超過一半 nbsp 答案 namespace esp sin pri continue
題意
N個數的序列,每次可以將一個數移動至開頭。問最少多少次操作可以使序列中沒有相鄰相同項。
T<=100, N<=1000
題解
先檢查是否有數字超過一半。
記錄各個數字需要移動的數字個數。若沒有數字超過一半,則答案為需要移動數字個數之和;否則需要從剩下的序列中移動數字,特判開頭的情況即可。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int a[1010], cnt[1010]; 5 6 int main() 7 { 8 int T; 9 scanf("%d", &T);10 while (T--) 11 { 12 memset(cnt, 0, sizeof(cnt)); 13 int n; 14 scanf("%d", &n); 15 for (int i = 0; i < n; ++i) 16 { 17 scanf("%d", a + i); 18 cnt[a[i]]++; 19 } 20 bool pd(0); 21 for (int i = 1; i <= n; ++i)22 if (cnt[i] > (n + 1) / 2) 23 pd = 1; 24 if (pd) 25 { 26 puts("-1"); 27 continue; 28 } 29 30 memset(cnt, 0, sizeof(cnt)); 31 int sum(0), duo(-1); 32 for (int i = 1; i < n; ++i) 33 if (a[i] == a[i - 1]) 34 { 35 cnt[a[i]]++; 36 sum++; 37 } 38 for (int i = 1; i <= n; ++i) 39 if (cnt[i] >= (sum + 1) / 2) 40 duo = i; 41 int kk = sum - cnt[duo]; 42 if (duo == a[0]) 43 cnt[duo]++; 44 if (duo == -1) 45 printf("%d\n", sum); 46 else 47 printf("%d\n", sum + max(cnt[duo] - 1 - kk, 0)); 48 } 49 50 return 0; 51 }
Aiiage Camp Day4 C KTV