ZOJ 3778:Talented Chef(贪心?思维)
Talented Chef
Time Limit: 2 Seconds Memory Limit: 65536 KB
As we all know, Coach Gao is a talented chef, because he is able to cook M dishes in the same time. Tonight he is going to have a hearty dinner with his girlfriend at his home. Of course, Coach Gao is going to cook all dishes himself, in order to show off his genius cooking skill to his girlfriend.
To make full use of his genius in cooking, Coach Gao decides to prepare N dishes for the dinner. The i-th dish contains Aii steps. The steps of a dish should be finished sequentially. In each minute of the cooking, Coach Gao can choose at most MMM different dishes and finish one step for each dish chosen.
Coach Gao wants to know the least time he needs to prepare the dinner.
Input
There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:
The first line contains two integers N and M (1<=N,M<=40000). The second line contains N integers Ai(1<=Ai<=40000).
Output
For each test case, output the least time (in minute) to finish all dishes.
Sample Input
2
3 2
2 2 2
10 6
1 2 3 4 5 6 7 8 9 10
Sample Output
3
10
题意
有n个菜,做每个菜需要ai步,每次最多可以做m个菜,求做完这n个菜最少需要多少时间
Solve
先提供一个超时的思路:将n个菜按照ai降序排序,排序后每次取出前m个菜,然后让这m个菜一直减到取出的最小的aii小于未取出的n−m个菜的最大的ai,然后将减少后的不等于0的ai放入序列中,重复上述操作,直到n个数全部为0。
时间复杂度大概为O(n×m)
不超时的算法:
将所有的ai加起来,sum=∑ai,然后sum除以m向上取整。
但是只有这样是不正确的:如果出现了⌈sum/m⌉<max(ai)的情况,那么所需的时间一定不会小于ai中的最大值,所以我们需要比较⌈sum/m⌉和max(ai)的值
证明:点这里吧,不太会证明。程序是照着超时的思路对拍出来的
Code
超时代码在最后
AC代码
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
const int inf=(1<<30);
const ll INF=(1LL*1<<60);
const int maxn=1e6+10;
const int mod=1e9+7;
const int maxm=1e3+10;
using namespace std;
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out1.txt", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
int n,m;
ll x;
cin>>n>>m;
ll sum=0;
ll maxx=0;
for(int i=0;i<n;i++)
{
cin>>x;
maxx=max(maxx,x);
sum+=x;
}
ll _=(sum - 1)/(1LL*m)+1;
cout<<max(maxx,_)<<endl;
}
return 0;
}
超时代码
/*************************************************************************
> Author: WZY
> School: HPU
> Created Time: 2019-04-20 09:07:07
************************************************************************/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 4e4 + 10;
int a[maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out2.txt", "w", stdout);
#endif
int t;
int x;
scanf("%d",&t);
while (t --)
{
int ans=0;
int n,m;
priority_queue<int,vector<int>,less<int> > que;
scanf("%d %d",&n,&m);
for (int i = 0;i < n;i ++)
{
scanf("%d",&x);
que.push(x);
}
while(!que.empty())
{
int cnt=0;
int minn;
for(int i=0;i<m;i++)
{
minn=que.top();
que.pop();
a[cnt++]=minn;
if(que.empty())
break;
}
int maxx;
if(que.empty())
maxx=0;
else
maxx=que.top();
int __=max(1,minn-maxx);
ans+=max(1,minn-maxx);
for(int i=0;i<cnt;i++)
{
a[i]=max(a[i]-__,0);
if(a[i])
que.push(a[i]);
}
}
printf("%d\n",ans);
}
return 0;
}
ZOJ 3778:Talented Chef(贪心?思维)的更多相关文章
- zoj 3778 Talented Chef(思维题)
题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...
- ZOJ 3778 Talented Chef(找规律,模拟计算,11届ACM省赛,简单)
题目链接 2014年浙江省赛C题,当时觉得难,现在想想这题真水.. 找规律: 若 最大的那个步骤数*m-总和>=0,那么答案就是 最大的那个步骤数 . 否则 就要另加上不够的数量,具体看代 ...
- ZOJ 3778 Talented Chef
题目链接 题意 : 这个人需要做n道菜,每道菜Ai步,他可以同时做M道不同的菜的其中一步,问你最少需要多少时间能做完所有的菜. 思路 : 这个题比赛的时候禁锢思路了,根本没想出来,就是当M > ...
- ZOJ 3778 Talented Chef 模拟 [ 祝愿明天省赛一帆风顺, ZJSU_Bloom WILL WIN : )
这题的意思是给你 n 道菜,第 i 道菜需要 Ai 步才能完成 每次你能对 m 道菜分别完成一步,请问最少需要几次? 这题暴力写肯定是不行的,去年省赛的时候就是没写出来这题,今天再把思路理一理吧. 首 ...
- ZOJ 3778 Talented Chief
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3778 题目 某人做菜很厉害,一分钟能同时完成最多m个菜的一道工序,输入菜的 ...
- Talented Chef ZOJ - 3778
As we all know, Coach Gao is a talented chef, because he is able to cook M dishes in the same time. ...
- Talented Chef(简单题,被我想的太复杂了,用复杂的方法当然会超时咯,由此可见,并非所有题都是想的越多越好)
Description As we all know, Coach Gao is a talented chef, because he is able to cook M dishes in the ...
- zoj3778 Talented Chef
As we all know, Coach Gao is a talented chef, because he is able to cook M dishes in the same time. ...
- Mike and distribution CodeForces - 798D (贪心+思维)
题目链接 TAG: 这是我近期做过最棒的一道贪心思维题,不容易想到,想到就出乎意料. 题意:给定两个含有N个正整数的数组a和b,让你输出一个数字k ,要求k不大于n/2+1,并且输出k个整数,范围为1 ...
随机推荐
- 05 Windows安装python3.6.4+pycharm环境
windows安装python3.6.4环境 使用微信扫码关注微信公众号,并回复:"Python工具包",免费获取下载链接! 一.卸载python环境 卸载以下软件: 二.安装py ...
- 使用input+datalist简单实现实时匹配的可编辑下拉列表-并解决选定后浏览器默认只显示value的可读性问题
问题背景 最近小伙伴提了一个希望提高后台下拉列表可操作性的需求,原因是下拉列表选项过多,每次下拉选择比较费时费力且容易出错,硬着头皮啃了啃前端知识,网上搜寻了一些下拉列表实现的资料,这里总结一下. P ...
- c#跳转
Response.Redirect(EditUrl("MEUID", lblMEUID.Text, "Page2", "PageOneMK" ...
- Spark产生数据倾斜的原因以及解决办法
Spark数据倾斜 产生原因 首先RDD的逻辑其实时表示一个对象集合.在物理执行期间,RDD会被分为一系列的分区,每个分区都是整个数据集的子集.当spark调度并运行任务的时候,Spark会为每一个分 ...
- 容器之分类与各种测试(四)——multimap
multiset和multimap的具体区别在于,前者的key值就是自己存储的value,后者的key与value是分开的不相关的. 例程 #include<stdexcept> #inc ...
- 【Linux】【Shell】【text】Vim
文本编辑器: 文本:纯文本,ASCII text:Unicode: 文本编辑种类: 行编辑器:sed 全屏编辑器:nano, vi vi: Visual Interface vim: Vi IMpro ...
- 基于阿里云ecs(centos 7) 安装jenkins
1. 安装好 jdk 2. 官网(https://pkg.jenkins.io/redhat-stable/)下载rpm包(稳定版): wget https://pkg.jenkins.io/redh ...
- Libev——ev_timer 相对时间定时器
Libev中的超时监视器ev_timer,是简单的相对时间定时器,它会在给定的时间点触发超时事件,还可以在固定的时间间隔之后再次触发超时事件. 1.超时监视器ev_timer结构 typedef st ...
- Java中的变量,数据类型和运算符
变量,数据类型和运算符 1.变量是一个数据存储空间的表示,它是储存数据的基本单元. 如何理解这句话,下面用一个表格可以形象的表达: 变量与房间之间的对应关系 房间名称 变量名 房间类型 变量类型 入住 ...
- Gitlab Flow到容器
一.简介 长话短说,本文全景呈现我司项目组gitlab flow && devops Git Flow定义了一个项目发布的分支模型,为管理具有预定发布周期的大型项目提供了一个健壮的框架 ...