2021牛客暑期多校训练营6
今天最开心的事情,就是AC了两道题目!虽然有一道题目是比赛完了之后就AC的那种。嗯,总的来说,感觉自己要注意细节,努力去理解题目含义,这样才能不断成长、天天AC!然后吧,就是要慢慢分析,实际问题,记得要考虑实际情况。比如,同一个汉堡不能同时被两个锅制作。
AC题目,两道签到题,F和I。
F题:Hamburger Steak(原题链接:F-Hamburger Steak_2021牛客暑期多校训练营6 (nowcoder.com))
题目:链接:https://ac.nowcoder.com/acm/contest/11257/F
来源:牛客网
思路:本题是一道贪心题目,就是要找出来最优时间,然后根据最优时间来安排汉堡。
首先,我们要求解最优时间。最优时间可能有两种情况,一种是t1=st/k(k表示锅的数目),一种是ti中的最大值t2。
那么为什么最优时间我们要去考虑这两部分呢?首先就是,题目中有一点点特别的地方就是,同一个汉堡,可以放在两个不同的锅里制作。也就是说,如果我们只取平均值,那么如果某个时间ti大于两倍的t1,那么我们将不得不把汉堡分成三段时间去制作(显然这样是不合理的),同理可得只考虑输入时间的最大值也是不合适的。
确定了最大值之后,接下来我们需要去做的事情,就是将汉堡放到锅里。这边,我们不用考虑顺序时间大小,直接按照输入的时间来计算就可以。简单来说,就是如果某个锅里汉堡所用的总时间超过了最优时间,那么我们就需要将多余的时间放到下一个锅里,不断重复,直到所有汉堡都被放到锅里。
具体代码:
#include<iostream> #include<cstdio> #define ll long long using namespace std; const int ins = 1e5+10; ll int a[ins];int main(){
ll int s1=0;
ll int n,m,maxn,ave=0;
ll int s=0;
scanf("%lld%lld",&n,&m);
for(ll int i=1;i<=n;i++){
scanf("%lld",&a[i]);
s+=a[i];
maxn=max(maxn,a[i]);
}
if(s%m!=0) ave=s/m+1;
else
ave=s/m;
maxn=max(ave,maxn);
ll int j=1,x;
for(ll int i=1;i<=n;i++){
if(s1<maxn){
s1=s1+a[i];
if(s1<maxn)
{printf("1 %lld %lld %lld\n",j,s1-a[i],s1);
x=s1;}
}
if(s1==maxn){
printf("1 %lld %lld %lld\n",j,s1-a[i],maxn);
s1=0;j++;
}
if(s1>maxn){
int t=s1-maxn;
printf("2 %lld 0 %lld %lld %lld %lld\n",j+1,t,j,x,maxn);
x=t;
s1=t;
j++;
}
}
return 0;
}
本文作者:风归去
本文链接:https://www.cnblogs.com/N-lim/p/15091342.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步