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 中国大陆许可协议进行许可。

posted @   风归去  阅读(21)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑