还没做完,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 }
View Code

相关文章: