首页 > 其他分享 >atcoder beginner contest 144 Gluttony(二分答案)

atcoder beginner contest 144 Gluttony(二分答案)

时间:2022-12-12 19:37:19浏览次数:50  
标签:二分 atcoder 144 beginner int bn bi 枚举 cerr


题目大意:

有an,bn ,我们找到an和bn每个元素的一种一一对应关系。使得min( max(ai*bi))。

已知我们可以进行操作让an中的任一个元素减少1。操作数最大为k,问我们怎么操作,可以min( max(ai*bi))。

解题思路:

首先,我们一个很直接的发现是:让an和bn进行一个排序,让an从小到大让bn从大到小排序,这时候让它们上下对齐放好,它们上下连线即为一个最佳匹配。em 证明..... 不懂。但是这样的确是最优匹配。因为很直观的发现,我们不想让ai和bi中大的放在一起,尽量让他们和对面的小的进行匹配。这时候,进入最关键的一步,枚举答案!

这里我们二分枚举答案。 这是本题最重要的思路!这里,为什么想到二分呢?首先,我们要想到枚举答案这个思路。其次我们试一下暴力枚举,但是暴力枚举在这里会超时,我们尝试二分枚举。每次得到一个答案,我们扫一遍数列,需要多大的操作数,若是小于k,我们则把答案继续缩,若是比k大,我们则把答案往大的扩。

二分的左边界是0,右边界是max(ai*bi)

#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<int> a;
vector<int> b;
int32_t main(){
int n,k;cin>>n>>k;
for(int i=0;i<n;i++){
int t;cin>>t;
a.push_back(t);
}
for(int i=0;i<n;i++){
int t;cin>>t;
b.push_back(t);
}
sort(a.begin(),a.end(),less<int>());
sort(b.begin(),b.end(),greater<int>());
int y=-1;
for(int i=0;i<n;i++){
y=max(a[i]*b[i],y);
}
int x=0;
int time=0;
while(x<y){
int m=x+(y-x)/2;
int suc=1;
int tmpk=0;
time++;
cerr<<"mid "<<m<<endl;
cerr<<time<<endl;
for(int i=0;i<n;i++){
int res=m/b[i];
//cerr<<i<<" "<<res<<endl;
if(res>a[i])continue;
tmpk+=a[i]-res;
//cerr<<tmpk<<endl;
if(tmpk>k){
suc=0;
break;}
}
if(suc)y=m;
else x=m+1;
}
assert(x==y);
cout<<x<<endl;

return 0;
}

 

标签:二分,atcoder,144,beginner,int,bn,bi,枚举,cerr
From: https://blog.51cto.com/u_15910522/5931531

相关文章

  • atcoder ABC 281(A-C)
    A要求你从N开始,一直打印到0。NN-1......3210简单#include<iostream>usingnamespacestd;intn;intmain(){ cin>>n; for(inti=n;i>=0;i--)cout<<i<<en......
  • 144-git config 及 git 初步导入命令
    这是全局的gitconfig--globaluser.name"admin"gitconfig--globaluser.email"[email protected]"gitconfig--globaluser.passwordadmin当前目录的:gitconfig......
  • AtCoder 问题乱做集1
    AGC014D BlackandWhiteTree*2266题目大意:两个人在$n$个节点的树上交替染色,先手染白色,后手染黑色。若染完之后有白点不与黑点相邻则先手胜,反之后手胜。求这棵树......
  • AtCoder Beginner Contest 242 F Black and White Rooks
    洛谷传送门AtCoder传送门不错的组合计数题。因为黑车和白车不能在同一行或者同一列,所以可以考虑枚举黑车有\(i\)行\(k\)列的位置放,白车有\(j\)行\(l\)列的位置......
  • AtCoder Beginner Contest 281
    \(\mathtt{rank:1119th}\)\(\mathtt{problem}\)\(\mathtt{A}\)\(\mathtt{B}\)\(\mathtt{C}\)\(\mathtt{D}\)\(\mathtt{E}\)\(\mathtt{F}\)\(\mathtt{G}\)\(\ma......
  • AtCoder Beginner Contest 281
    https://atcoder.jp/contests/abc281A-CountDown原题链接题意给出一个数\(n\),按降序输出所有小于或等于\(n\)的非负整数。分析签到题,循环并输出从\(n\)到\(......
  • 【atcoder abc281_d】动态规划
    importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;/***@authorfishcanfly*/publicclassMain{/***......
  • AtCoder Beginner Contest 281
    比赛链接A-CountDownA题题面直接输出即可B-SandwichNumberB题题面这道题首先判断开头结尾是否为大写字母,然后判断总长度是否为8,然后对中间一段转数字即可。C......
  • Atcoder-ABC281-DEF题解
    AtcoderBeginnerContest281D.MaxMultiple(DP)题意在长度为\(N\)的序列\(A\)中,找到\(K\)个元素其和为\(D\)的倍数,找出满足要求最大的和,没有则返回-1。数......
  • [WIP]Unix / Linux for Beginners
    创建:2022/12/9 GetStarted            FileManagement            Direct......