题目链接:http://www.codechef.com/TCFST13/problems/TCFST06
我表示只能刷刷水题了~~
计算一个数组变成前面都负数后面都正数的最小操作个数。
枚举中间点就ok
代码如下
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int n, a[500100], ans, na, pos, lna, lpos, lans; 7 8 int main() 9 { 10 // freopen("in.txt", "r", stdin); 11 12 while(cin >> n) 13 { 14 ans = 0; 15 na = 0, pos = 0; 16 for(int i=0; i<n; i++){ 17 scanf("%d", &a[i]); 18 19 if(a[i]==0)ans++; 20 if(a[i]<0)na++; 21 if(a[i]>0)pos++; 22 } 23 lna = 0, lpos = 0, lans = n-pos-ans; 24 for(int i=0; i<n; i++){ 25 if(a[i]==0)continue; 26 else if(a[i]<0) lna++; 27 else lpos++; 28 if(lpos+(na-lna)<lans) 29 lans = lpos+(na-lna); 30 } 31 ans+=lans; 32 printf("%d\n", ans); 33 } 34 return 0; 35 }