Fishing Master 贪心!!

在这里插入图片描述
传送门
思路:
每条鱼都需要被抓上来并且煮足够的时间,而我们能在炖鱼的时候抓鱼,所以至少需要抓一条鱼的时间和炖所有鱼的时间,也就是 。要能在这个时间内就完成,则除了抓第一条鱼以外抓鱼的时候锅里都必须在炖鱼(假设锅里的鱼一旦炖好就自动取出来),显然如果 都太小的时候这是不能做到的,会有一些抓鱼的时间锅里没有在炖鱼,我们称锅里没有炖鱼的抓鱼时间为被浪费的时间,所以我们的优化目标就是使被浪费的总时间T最小,答案即为 。对于第 条鱼,炖它的时候我们可以不浪费时间抓到 条鱼,或者浪费 的时间抓到条鱼。所以如果 ,则可以不浪费时间完成任务;如果 ,则差条鱼就选炖 前 大的鱼的时候浪费时间多抓一条鱼。

代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<cmath>
#define Xiaobo main
#define IO cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);
using namespace std;
const int maxn=1e5+5;
const int mod=1e9+7;
const double eps=1e-15;
const double pi=acos(-1);
const int INF=0x3f3f3f;
typedef long long ll;
ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();if(c == '-')Nig = -1,c = getchar();while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();return Nig*x;}
ll qpow(ll a,ll b,ll m){ ll ans=1; while(b){ if(b&1) ans=ans%a%m;a=a*a%m,b>>=1;} return ans; }
ll qpow(ll a,ll b){ ll ans=1;while(b>0){ if(b&1) ans=ans*a;a*=a,b>>=1; } return ans;}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
ll mul(ll a,ll b,ll m){ll res=0;while(b>0) { if(b&1) res=(res+a)%m;a=(a+a)%m;b>>=1;}return res;}
int n,t,k;
int num[maxn];//记录炖鱼时间 
int Xiaobo()
{
	IO;
	cin>>t;
	while(t--) {
		cin>>n>>k;
		ll sum=0;
		int cnt=0;
		for(int i=1;i<=n;i++) {
			cin>>num[i];
			sum+=num[i];
			cnt+=num[i]/k;//记录炖当前鱼最多能抓几条鱼 
			num[i]%=k;//记录取余的结果 后面抓剩下的鱼要用到 
		}
		if(cnt>=n-1) cout<<sum+k<<endl;//正好不浪费时间 
		else {
			sort(num+1,num+n+1,greater<int>());//按再抓一条鱼需要时间多少排序 
			ll ans=sum+k;
			for(int i=1;i<=n;i++) {
				ans+=k-num[i];//ans记录再抓一条鱼所需要的时间 
				cnt++;//鱼数增加 
				if(cnt>=n-1) break;
			}
			cout<<ans<<endl;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值