Day 2
codeforces:670D2:Problem - 670D2 - Codeforces思路已知其含有单调性能烤100块也能烤99、98、97......所以本题直接二分查找就可以了没什么其他需要说明的//检查再有k克魔法粉下能否做出mid个饼干 bool check(ll mid,int n,ll k,const vectorll a,const vectorll b){ ll ne0; for(int i0;in;i){ //第i种原料需要的总数 ll ne_suma[i]*mid; //计算需要的魔法粉末的数量 if(ne_sumb[i]){ ne(ne_sum-b[i]); } //超过就不算了节约时间 if(nek) return false; } return nek; } void solve(){ int n; ll k; cinnk; vectorll a(n),b(n); for(int i0;in;i) cina[i]; for(int i0;in;i) cinb[i]; ll l0,r2000000000LL,ans0; while(lr){ ll midl(r-l)/2; if(check(mid,n,k,a,b)){ ansmid; lmid1; }else{ rmid-1; } } coutans\n; }1404Problem - 1404A - Codeforces本题降级解释给你一个含有三种字符01?字符串长度n要求把?变成0/1后所有长度为k的子串一半0一半1k为偶数思路首先我们确定一个事实题目的核心要求是整个字符串必须以k为周期重复原因如下窗口 1[i, i1, ..., ik-1, ik]窗口 2[i1, ..., ik-1, ik]则这两个中间的k-1个字符完全相同则只有一种可能第一个字符等于最后一个字符t[i]t[ik]则整个题目都很简单了1.按字符串按模k分组每组的字符必须完全相同2.只用检查第一个窗口0和1的数量都小于k/2则输出YES否则为NOvoid solve(){ int n,k; cinnk; string s; cins; bool ptrue; for(int i0;ik;i){ char c?; //检查同一个周期内的所有位置 for(int ji;jn;jk){ if(s[j]!?){ if(c!?s[j]!c){ pfalse;//周期冲突 break; } cs[j]; } } if(!p) break; //将确定的字符同步回第一个周期 if(c!?){ for(int ji;jn;jk) s[j]c; } } if(!p){ coutNO\n; return; } int cnt00,cnt10; //统计第一个窗口就可以了 for(int i0;ik;i){ if(s[i]0) cnt0; else if(s[i]1) cnt1; } if(cnt0k/2cnt1k/2){ coutYES\n; }else{ coutNO\n; } }1352F:Problem - 1352F - Codeforces先给题目降级给你三个数满足这三个数的条件让你还原出任意一个二进制字符串n0相邻两位都是0的次数n1相邻两位一个0一个1的次数n2相邻两位都是1的次数思路总结规律连续x个1生成x-1个11连续y个0生成y-1个00每一次0和1的切换生成一个n1则我们可以直接进行构造无n1全0或全1有n1固定先输出n21个-再输出n01个0-然后n1-1次切换void solve(){ int n0,n1,n2; cinn0n1n2; if(n10){ if(n00){ coutstring(n01,0)\n; }else{ coutstring(n21,1)\n; } return; } string res; resstring(n21,1); resstring(n01,0); for(int i0;in1-1;i){ if(i%20){ res1; }else{ res0; } } coutres\n; }