码迷,mamicode.com
首页 > Windows程序 > 详细

ZOJ 3778 Talented Chef 模拟 [ 祝愿明天省赛一帆风顺, ZJSU_Bloom WILL WIN : )

时间:2015-04-24 22:22:52      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

这题的意思是给你 n 道菜,第 i 道菜需要 Ai 步才能完成

每次你能对 m 道菜分别完成一步,请问最少需要几次?

 

这题暴力写肯定是不行的,去年省赛的时候就是没写出来这题,今天再把思路理一理吧。

 

首先我们需要明确的是

1. n <= m 的时候, 那么答案显而易见,就是 Max (A[i])

2. n > m 

  ①此时我们不难发现这个现象,如果 sum (A[i]) 能被 m 整除,那么我们可能恰恰只需要 (sum / m) 次即可完成

    一个例子: n = 3, m = 2

         a[1] = 1, a[2] = 2, a[3] = 3

  

  ②如果,sum (A[i]) 不能被 m 整除,那么只需要在 ① 的基础上加1即可

 

当然,这里不能忘了,在答案输出的时候,要保证答案 >= Max(A[i]), 否则会出现对一个 A[i] 多次减法操作

 

贴上 Source Code:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string>
 4 #include <cstring>
 5 #include <stack>
 6 #include <queue>
 7 #include <vector>
 8 #include <cstdlib>
 9 #include <algorithm>
10 
11 using namespace std;
12 
13 int a[60000];
14 int n, m;
15 
16 int main (){
17     int i, j, k, u, v, t;
18 
19     cin >> t;
20     while (t--) {
21         cin >> n >> m;
22         int sum = 0;
23         int MAX = 0;
24         for (i = 0; i < n; ++i){
25             cin >> a[i];
26             sum += a[i];
27             MAX = max (MAX, a[i]);
28         }
29 
30         if (n <= m) {
31             cout << MAX << endl;
32             continue;
33         }
34 
35         int cur = sum / m;
36         if (sum % m != 0)   ++cur;
37 
38         cur = max(cur, MAX);
39 
40         cout << cur << endl;
41     }
42 
43     return 0;
44 }

 

ZOJ 3778 Talented Chef 模拟 [ 祝愿明天省赛一帆风顺, ZJSU_Bloom WILL WIN : )

标签:

原文地址:http://www.cnblogs.com/wushuaiyi/p/4454474.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!