还没做完,ACM的题目真多,一场考试有11道。MD我只有一个人。
A题(HDU5933)
分析:容易发现最左边的只能从它右边得到,容易想到一个贪心过程,只需要没到规定大小就合并,到了就分裂,不难证明这是最优的。
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 template<typename T> 5 void in(T &x){ 6 char ch = getchar();x=0; 7 while(ch>'9'||ch<'0') ch = getchar(); 8 while(ch <= '9' && ch >= '0') x = x*10+ch-'0',ch = getchar(); 9 } 10 ll a[120000]; 11 12 int main(){ 13 int t; in(t); 14 for(int ti = 1; ti <= t; ti++) { 15 ll n,k; in(n),in(k); 16 ll sum = 0; 17 for(int i = 1; i <= n; i++){ 18 in(a[i]); 19 sum = sum + a[i]; 20 } 21 printf("Case #%d: ",ti); 22 ll ans = 0; 23 if(sum % k != 0){printf("-1\n");} 24 else{ 25 ll last = a[1]; 26 for(int i = 2; i <= n;){ 27 if(last == sum/k){last = a[i]; i++;continue;} 28 if(last < sum/k){last += a[i]; ans ++;i++;} 29 else{last -= (sum/k);ans++;} 30 } 31 ans += last/(sum/k)-1; 32 printf("%I64d\n",ans); 33 } 34 } 35 return 0; 36 }