首页 > 其他分享 >[USACO10FEB] Chocolate Eating

[USACO10FEB] Chocolate Eating

时间:2024-01-30 16:24:26浏览次数:20  
标签:cnt Eating int ll USACO10FEB Chocolate sum check left

原题链接

很典型的二分答案题目。但是新颖点是他要输出每块巧克力在哪一天吃,很多人(包括我自己)就可能想当然的直接在累加的时候处理,如下:

    for (int i=1;i<=d;i++){
        sum/=2;
        while (sum<m){
            if (cnt>n) return false;
            sum+=a[cnt];
            b[cnt++]=i;
        }
    }

这么做本身没问题,但是会导致当最后一段sum>=m时会有相当一部分的bi没有存上值。修改如下:

bool check(ll m){
    ll sum=0,cnt=1;
    for (int i=1;i<=d;i++){
        sum/=2;
        while (sum<m){
            if (cnt>n) return false;
            sum+=a[cnt];
            b[cnt++]=i;
        }
    }
    if (cnt<=n)
        for (int i=cnt;i<=n;i++) b[i]=d;
    return true;
}

还有一点,由于我们实在check时对b数组进行处理,那么我们不一定保证最后一次执行check时一定会产生正确答案,所以我们要在找出对应的值时再执行一次check。

主要代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e4+5;
int a[N],b[N],d,n;
bool check(ll m){
    ll sum=0,cnt=1;
    for (int i=1;i<=d;i++){
        sum/=2;
        while (sum<m){
            if (cnt>n) return false;
            sum+=a[cnt];
            b[cnt++]=i;
        }
    }
    if (cnt<=n)
        for (int i=cnt;i<=n;i++) b[i]=d;
    return true;
}
int main(){
//    freopen("input2.txt","r",stdin);
//    freopen("output.txt","w",stdout);
    std::ios::sync_with_stdio(false);
    cin>>n>>d;
    ll left=0,right=1;
    for (int i=1;i<=n;i++){
        cin>>a[i];
        right+=a[i];
    }
    while (left+ll(1)<right){
        ll mid=(left+right)>>1;
        if (check(mid)) left=mid;
        else right=mid;
    }
    check(left);   //不要忘了额外执行一次
    cout<<left<<"\n";
    for (int i=1;i<=n;i++) 
        cout<<b[i]<<"\n";
    return 0;
}

 

标签:cnt,Eating,int,ll,USACO10FEB,Chocolate,sum,check,left
From: https://www.cnblogs.com/purple123/p/17997357

相关文章

  • ABC337 D Cheating Gomoku Narabe 题解
    QuestionABC337DCheatingGomokuNarabe给出一个\(H\timesW\)的矩阵,由o,x,.组成,一次操作为把一个.变成o,问需要最少多少次操作使得横着或竖着有连续的\(K\)个oSolution先来考虑只有一行的情况,我们定义一个长度为\(K\)的"窗口",假设需要把这个"窗口"里面的所有......
  • acme.sh 签发证书如果提示 Error creating new account 试试这个解决方法
    24年1月18日用 acme.sh命令签发ssl证书,使用的--issue参数。acme.sh--issue--dnsdns_dp-dxxx.com-dwww.xxx.com--force会提示错误:Error,cannotgetdomaintoken"type":"dns-01","url":"https://acme.zerossl.com/v2/DV90/chall/-qe......
  • Chocolate
    只因生日!祝她生日快乐!(1班晚自修祝她福如东海寿比南山,代行我职,这是好的剩下的都是闲话力:非常喜欢蔡绿喜糖里的夹心巧克力,鉴定为比德芙强114514倍。晚自修出逃回寝室睡了12h,现在精神状态良好。政治会不了一点,直接载入史册!(甚至还用考试时间写语文,这是好的)体育大概率能A,太讽......
  • 初中英语优秀范文100篇-036Eating out or Dining at Home-出去吃还是在家吃
    PDF格式公众号回复关键字:SHCZFW036记忆树1Eatingoutisveryconvenientbecausenoonehastocook.翻译外出就餐非常方便,因为没有人需要做饭。简化记忆方便句子结构1"Eatingout":这是一个动名词短语,用来表示行为。"eating"(吃)是动词,用作现在分词形式,用来构成动名......
  • 『LeetCode』3. 无重复字符的最长子串 Longest Substring Without Repeating Characte
    『1』双指针算法我的想法:一般看到字符串子串问题想到用双指针解,看到字符串子序列问题想到用动态规划解。此题用双指针可以很快解题。遍历字符串中的每个字符s.charAt[i],对于每一个i,找到j使得双指针[j,i]维护的是以s.charAt[i]结尾的无重复字符的最长子串,长度为i-j+1,......
  • P3071 [USACO13JAN] Seating G 题解
    题意:维护两个操作,区间推平,求连续\(0\)的个数为\(x\)的最前位置。线段树。因为需要求连续\(0\)的个数,所以维护区间左边连续\(0\)的最大个数,区间右边连续\(0\)的最大个数以及区间连续\(0\)的最大个数。注意修改的时候要看是修改为\(1\)还是修改为\(0\)。查询的时......
  • Github Actions - Creating PostgreSQL service containers
     #Servicecontainerstorunwith`container-job`services:#Labelusedtoaccesstheservicecontainerpostgres:#DockerHubimageimage:postgres#Providethepasswordforpostgresenv:......
  • Problem: E. Chocolate Bar
    题意:给定一个nm个方块组成的巧克力块,最终要吃到k个方块有两种切的方式:(nm)1.横着切,成本是mm2.竖着切,成本是nn做法:考虑记忆化搜索,使用dp[n][m][k]代表一个n*m的巧克力最后要得到k块所需要的最小成本状态转移:把每一次切的动作看作是一次转移:以n,m,k为例1.横着切,那么每......
  • 无涯教程-批处理 - Creating Files函数
    新文件的创建是在重定向过滤器>的帮助下完成的,该过滤器可用于将任何输出重定向到文件。@echooffecho"Hello">C:\new.txt如果文件new.txt在C:\中不存在,则将在上述命令将创建new.txt文件,并将hello写入文件。参考链接https://www.learnfk.com/batch-script/batch-script-crea......
  • Creating HTML table with vertically oriented text as table header 表头文字方向
    ASanoldquestion,thisismorelikeinfoorreminderaboutverticalmarginorpaddingin%thattakesparent'swidthasreference.Ifyouuseapseudoelementandvertical-padding,youmaybasiclydrawasquareboxor<td>:http://jsfiddle.n......