首页 > 其他分享 >Codeforces Round 935 (Div. 3)

Codeforces Round 935 (Div. 3)

时间:2024-03-22 22:13:27浏览次数:19  
标签:const int void Codeforces cin 队列 solve Div 935

A - Setting up Camp

思路:判断c能否填充b让b为3的倍数

查看代码

void solve() {
    int a,b,c;
    cin>>a>>b>>c;
    int ans=a+b/3;
    b%=3;
    if(b>0&&b+c<3)cout<<-1<<'\n';
    else{
        ans+=(b+c+2)/3;
        cout<<ans<<'\n';
    }
}

 

B - Fireworks

思路:同时开炮是最优的,计算在第一炮消失前a和b能发射的最大炮数

查看代码
 void solve() {
    int a,b,m;
    cin>>a>>b>>m;
    m++;
    cout<<(m+a-1)/a+(m+b-1)/b<<'\n';
}

 

C - Left and Right Houses

思路:枚举分界线,同时维护左右的01个数

查看代码
 void solve() {
    int n;
    string s;
    cin>>n>>s;
    double p=1e9;
    int r=0,ans;
    for(int i=0;i<s.size();++i){
        if(s[i]=='1')r++;
    }
 
    for(int i=0,l=0;i<=n;++i){
        if(l>=((i+1)/2)&&r>=((n-i+1)/2)){
            double t=fabs(n*1.0/2-i);
            if(!(fabs(t-p)<eps)&&t<p){
                p=t,ans=i;
            }
        }
        if(i<n)l+=(s[i]=='0'),r-=(s[i]=='1');
    }
 
    cout<<ans<<'\n';
}

 

D - Seraphim the Owl

思路:由于可以任选a,实际上就是最后要站在m内,且最后站的位置选a,后面的所有人ab取最小值

查看代码
 void solve() {
    int n, m;
    cin>>n>>m;
    vector<int>a(n+1),b(n+1),mi(n+1),r(n+5);
    for(int i=1;i<=n;++i)cin>>a[i];
    for(int i=1;i<=n;++i){
        cin>>b[i];
        mi[i]=min(a[i],b[i]);
    }
    for(int i=n;i>=1;--i)r[i]=r[i+1]+mi[i];
    int res=LLONG_MAX;
    for(int i=1;i<=m;++i){
        res=min(res,a[i]+r[i+1]);
    }
//    if(n==m)res=0;
    cout<<res<<'\n';
}

 

E - Binary Search

思路:模拟出原本数组二分x的位置,若与x原本位置不同交换即可

查看代码
 void solve() {
    int n,x,p;
    cin>>n>>x;
    vector<int>a(n+1);
    for(int i=1;i<=n;++i){
        cin>>a[i];
        if(a[i]==x)p=i;
    }
    int l=1,r=n+1;
    while(l+1<r){
        int mid=l+r>>1;
        if(a[mid]<=x)l=mid;
        else r=mid;
    }
    if(l==p)cout<<0<<'\n';
    else{
        cout<<1<<'\n';
        cout<<p<<' '<<l<<'\n';
    }
}

 

F - Kirill and Mushrooms

思路:可以枚举选的个数k,不能选的数已经确定为前k-1个,用multiset维护剩下的可选的数,选出最大的k个数。若当前需要删的数在set里,直接在set里删即可,若不在说明在已选的数里删,还需要在set再选取一个数补回去。由于选的数是递减的,每选一次的数一定是最小的,直接维护其为最小值即可

查看代码
 void solve() {
    int n;
    cin>>n;
    multiset<int>q;
    vector<int>a(n+1),b(n+1);
    for(int i=1;i<=n;++i){
        cin>>a[i];
        q.insert(a[i]);
    }
    for(int i=1;i<=n;++i){
        cin>>b[i];
    }
    int ans=*q.rbegin(),cnt=1,low=LLONG_MAX;
    q.erase(q.find(*q.rbegin()));
    for(int i=1;2*i+1<=n;++i){
        auto p=q.lower_bound(a[b[i]]);
        if(p!=q.end()){
            q.erase(p);
            low=*q.rbegin();
            q.erase(q.find(*q.rbegin()));
        }else{
            q.erase(q.find(*q.rbegin()));
            low=*q.rbegin();
            q.erase(q.find(*q.rbegin()));
        }
        if(low*(i+1)>ans){
            ans=low*(i+1),cnt=i+1;
        }
    }
    cout<<ans<<' '<<cnt<<'\n';
}

 

G - Cook and Porridge

思路:由于原先的队列已定,并且不是按k排序的,需要将再次入队的与原先队列分开判断,再次入队的是按k排序,所以直接用优先队列维护即可。选取队首时,需要从原先队列队首和优先队列队首二选一,怎么选呢,对于原先队列求k的后缀最大值,只有当一个人的k大于原先队列队首的后缀最大值,其才能够插队到原先队列前,可以由此来判断优先队列队首是否能插到原先队列队首前面。对于正在吃饭的人,直接用优先队列维护吃完饭的时间即可。注意,在重新入队时,只有当入队时间相同时才用s来判断队列里的优先级

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=4e4+5,INF=0x3f3f3f3f,Mod=1e9+7,mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-12;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};

struct Eq{
    int k,id,s,time;
    bool operator<(const Eq&e)const{
        if(k!=e.k)return k<e.k;
        if(time!=e.time)return time>e.time;
        return s>e.s;
    }
};
struct Eh{
    int t,id;
    bool operator<(const Eh&e)const{
        return t>e.t;
    }
};
void solve() {
    int n,D;
    cin>>n>>D;
    vector<int>k(n+1),s(n+1),r(n+1);
    for(int i=1;i<=n;++i)cin>>k[i]>>s[i];
    r[n]=k[n];
    for(int i=n-1;i>0;--i)r[i]=max(r[i+1],k[i]);
    priority_queue<Eq>q;
    priority_queue<Eh>have;
    int to=1;
    for(int i=1;i<=D;++i){

        if(q.size()){
            auto f=q.top();
            if(f.k>r[to]){
                q.pop();
                have.push({i+s[f.id],f.id});
            }else{
                have.push({i+s[to],to});
                to++;
            }
        }else{
            have.push({i+s[to],to});
            to++;
        }

        if(to>n){
            cout<<i<<'\n';
            return ;
        }
        while(have.size()&&have.top().t<=i){
            auto f=have.top();
            have.pop();
            q.push({k[f.id],f.id,s[f.id],i});
        }
    }
    cout<<-1<<'\n';
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    cin>>t;
//    init();
    while(t--){
        solve();
    }
    return 0;
}

 

标签:const,int,void,Codeforces,cin,队列,solve,Div,935
From: https://www.cnblogs.com/bible-/p/18090306

相关文章

  • cfRound935div3--DEFG题解
    ps:这场因为精神状态不佳,又C题题意有点绕,卡题了,头晕找不到错.最后做了两题就溜了.狠狠扣90分..D-SeraphimtheOwl题意:即选一个位置,使得其满足题意。而且在满足题意的基础上,要靠近中心越好,如果满足题意而且靠近中心的距离一样,那么输出前面那个.intcnt0[300005]={0};......
  • CF1920 Codeforces Round 919 (Div. 2)
    B.SummationGame给你\(n\)个数(均大于0),Alice先执行一次删除不超过\(k\)个数,Bob再执行一次把最多\(x\)个数变成相反数.问最后数组的最大和是多少?这题本来是想先让Alice删除\(k\)个数,但显然不太容易得到最优解,因为还有可能撤回Alice的删除操作,再加上Bob的操作.......
  • Codeforces Round 935 (Div. 3)
    A.SettingupCamp#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;voidsolve(){inta,b,c;cin>>a>>b>>c;intres=a+b/3;b%=3;if(b!=0){if(c<3-b){......
  • 1943+1944.Codeforces Round 934 (Div. 1,Div. 2) - sol
    20240321终于差不多把Div1补完了(F当然没补),第一次打Div1,还是出了一些小状况的。唉。没有补Div1F的逆天题,选择放弃。Dashboard-CodeforcesRound934(Div.2)-CodeforcesDashboard-CodeforcesRound934(Div.1)-Codeforces2A.DestroyingBridgesThere......
  • Educational Codeforces Round 163 (Rated for Div. 2)
    Preface这周很奇怪,连着计网、数据库、组合数学的课都莫名其妙不上了,突然变得很空闲了的说正好有空赶紧补补题,不然接下来有很多造题/比赛的任务搁置着就忘记了A.SpecialCharacters签到,\(n\)是偶数才有解,构造的话注意到一个AAB可以产生\(2\)的贡献,把\(\frac{n}{2}\)个AAB拼起......
  • Tree Compass Codeforces Round 934 (Div. 2) 1944E
    Problem-E-Codeforces题目大意:有一棵n个点的树,初始状态下所有点都是白色的,每次操作可以选择一个点u和一个距离dis,使得距离点u所有长度为dis的点变为黑色,问最少需要多少次操作能使所有点变成黑色,输出所有操作1<=n<=2000思路:要想操作数最少,就要使每次操作涂黑的点的数量尽......
  • HDU 1059 Dividing
    题目传送门:Problem-1059(hdu.edu.cn)问题描述玛莎和比尔拥有一些弹珠。他们希望在自己之间分配收藏品,以便双方都获得平等的弹珠份额。如果所有弹珠都具有相同的价值,这将很容易,因为这样他们就可以将收藏品分成两半。但不幸的是,有些弹珠比其他弹珠更大或更漂亮。因此,Marsha......
  • linux 中shell脚本中遇到 Runtime error (func=(main), adr=22): Divide by zero
    在Linux中编写Shell脚本时,遇到“Runtimeerror(func=(main),adr=22):Dividebyzero”这样的错误通常是因为在脚本中进行了除以零的操作,类似于编程语言中的除零错误。要解决这个问题,您需要检查Shell脚本中涉及到除法运算的地方,确保分母不为零。下面是一个示例S......
  • Codeforces Round 935 (Div. 3) A-G
    A传送门  先考虑无解情况,外在人的数量如果%3之后还剩下x人,只能靠第三类综合性人y来补充进去,如果x+y小于3则无解,有解只需要向上取整即可。#include<bits/stdc++.h>usingll=longlong;typedefstd::pair<int,int>PII;typedefstd::array<int,4>ay;constintN=......
  • codeforce Round 935 div3 个人题解(A-E)
    A.SettingupCamp时间限制:每个测试1秒内存限制:每个测试256兆字节输入:标准输入输出:标准输出组委会计划在游览结束后带领奥林匹克运动会的参赛选手进行徒步旅行。目前,正在计算需要搭帐篷的数量。已知每顶帐篷最多可容纳3人。在参赛选手中,有a个内向型,b个外向型和c个综合型:......