Fishing Master(思维+贪心)

                                               Fishing Master

题意:

         一开始题意搞错了,题意还是很重要的!

         首先输入t(1<=t<=20)表示有t组数据。对于每组数据,第一行输入n,k(1e9),n表示有n条鱼,k表示每条鱼要抓的时间为k;

接下来一行ti(1e9)表示编号为i的鱼需要煮ti时间。注意在抓鱼的时候,不能把鱼放进锅里煮(只能等抓鱼结束),而煮鱼的时候可以抓鱼。

题解:

        一开始尽量抓要煮时间多的鱼,这样就可以在煮鱼的时候多抓几条鱼。还有一个重点煮鱼的时间是必花的(突破口)

       而后开始计算he=1+sum(ti/k)(1<=i<=n),如果he>=n,显然煮鱼不用等抓鱼。

      否则就要等抓鱼,等抓鱼的时间是k-ti%k,取ti%k大的就好。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int t,n,k,a[N];
void solve(){
    #define ll long long
    ll ans=k,cnt=1;
    for(int i=1;i<=n;i++)cnt+=a[i]/k,ans+=a[i],a[i]%=k;
    sort(a+1,a+n+1);
    if(cnt>=n){cout<<ans<<endl;return;}
    for(int i=n;i>=cnt+1;i--)ans+=(k-a[i]);
    cout<<ans<<endl;
}
int main(){
   // freopen("tt.in","r",stdin),freopen("tt.out","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>t;
    while(t--){
        cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i];
        solve();
    }
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值