[Updating] Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) 解题报告

Problem A - Carrot Cakes

//Author: Lixiang
#include<stdio.h>
struct A{
    int n,t,k,d;
    void init(){
        scanf("%d%d%d%d",&n,&t,&k,&d);
    }
    void work(){
        int a=n/k;
        if(a*k<n)a++;
        a*=t;
        int b=d/t;
        if(b*t<d)b++;
        n-=b*k;
        if(n<0){
            puts("NO");
            return ;
        }
        b*=t;
        int c=n/k,ans;
        if(c*k<n)c++;
        if(c%2==1){
            c=(c+1)/2;
            c*=t;
            ans=d+c;
        }
        else{
            c=c/2;
            c*=t;
            ans=b+c;
        }
        if(ans<a)puts("YES");
        else puts("NO");
    }
}sol;
int main(){
    sol.init();
    sol.work();
    return 0;
}

Problem B - T-shirt buying

模拟

//Author: Lixiang
#include<stdio.h>
#include<map>
#include<queue>
using namespace std;
const int maxn=200001;
struct B{
    map <int,bool> used;
    priority_queue <int,vector <int>,greater<int> > C[4];
    int p[maxn],a[maxn],b[maxn];
    int N,M;
    void init(){
        scanf("%d",&N);
        for(int i=1;i<=N;i++)
            scanf("%d",p+i);
        for(int i=1;i<=N;i++)
            scanf("%d",a+i);
        for(int i=1;i<=N;i++)
            scanf("%d",b+i);
        for(int i=1;i<=N;i++){
            C[a[i]].push(p[i]);
            C[b[i]].push(p[i]);
            used[p[i]]=1;
        }
    }
    void work(){
        scanf("%d",&M);
        for(int i=1,c;i<=M;i++){
            scanf("%d",&c);
            while(!C[c].empty()&&!used[C[c].top()])C[c].pop();
            if(C[c].empty())puts("-1");
            else{
                printf("%d ",C[c].top());
                used[C[c].top()]=0;
            }
        }
    }
}sol;
int main(){
    sol.init();
    sol.work();
    return 0;
}

Problem C - Fountains

找C+C C+D D+D三种情况中最优的
二分+贪心

//Author: Lixiang
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=100001;
struct Fountains{
    int b,p;
    void init(int bb,int pp){
        b=bb;p=pp;
    }
    bool operator<(struct Fountains b)const{
        return p<b.p;

    }
}f[2][maxn];
struct C{
    int m[2][maxn];
    int N,C,D,n1,n2;
    void init(){
        char ch;
        scanf("%d%d%d",&N,&C,&D);
        for(int i=1,b,p;i<=N;i++){
            scanf("%d %d %c",&b,&p,&ch);
            if(ch=='C')f[0][++n1].init(b,p);
            else f[1][++n2].init(b,p);
        }
        sort(f[0]+1,f[0]+n1+1);
        sort(f[1]+1,f[1]+n2+1);
        for(int i=1;i<=n1;i++)
            m[0][i]=max(m[0][i-1],f[0][i].b);
        for(int i=1;i<=n2;i++)
            m[1][i]=max(m[1][i-1],f[1][i].b);
    }
    int bs(int val,Fountains a[],int N){
        int L=1,R=N,M,ans=0;
        while(L<=R){
            M=(L+R)/2;
            if(a[M].p>val)R=M-1;
            else{
                L=M+1;
                ans=M;
            }
        }
        return ans;
    }
    void work(){
        int i=bs(C,f[0],n1),j=bs(D,f[1],n2);
        if(i==0){
            int ans=0;
            for(;j>=2;j--){
                int id=bs(D-f[1][j].p,f[1],j-1);
                if(id>0)ans=max(ans,m[1][id]+f[1][j].b);
            }
            printf("%d\n",ans);
            return ;
        }
        if(j==0){
            int ans=0;
            for(;i>=2;i--){
                int id=bs(C-f[0][i].p,f[0],i-1);
                if(id>0)ans=max(ans,m[0][id]+f[0][i].b);
            }
            printf("%d\n",ans);
            return ;
        }
        int ans=m[0][i]+m[1][j];
        for(;i>=2;i--){
            int id=bs(C-f[0][i].p,f[0],i-1);
            if(id>0)ans=max(ans,m[0][id]+f[0][i].b);
        }
        for(;j>=2;j--){
            int id=bs(D-f[1][j].p,f[1],j-1);
            if(id>0)ans=max(ans,m[1][id]+f[1][j].b);
        }
        printf("%d\n",ans);
    }
}sol;
int main(){
    sol.init();
    sol.work();
    return 0;
}

Problem D - field expension

D题改了10发,下次再改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值