Codeforces Round #610 (Div. 2)

Posted yiqiatiya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #610 (Div. 2)相关的知识,希望对你有一定的参考价值。

比赛链接

A

求两条线段交的长度。

({frak{code:}})

    #include<bits/stdc++.h>
    #define IL inline
    #define LL long long
    using namespace std;
    const int N=3e3+5,p=998244353;
    int a,b,c,r;
    IL int in(){
        char c;int f=1;
        while((c=getchar())<'0'||c>'9')
          if(c=='-') f=-1;
        int x=c-'0';
        while((c=getchar())>='0'&&c<='9')
          x=x*10+c-'0';
        return x*f;
    }
    int main()
    {
        int t=in();
        while(t--){
            a=in(),b=in(),c=in(),r=in();
            if(a>b) swap(a,b);
            int L=c-r,R=c+r;
            if(L<=b&&R>=a) printf("%d
",(b-a)-(min(b,R)-max(a,L)));
            else printf("%d
",b-a);
        }
        return 0;
    }

B

考虑购买(n)个物品,排序,先选第(n-k+1)(n)个物品,花费(v_n),再购买物品(n-k),以此推类,最后再一个个购买物品(1)(nmod k)

({frak{code:}})

    #include<bits/stdc++.h>
    #define IL inline
    #define LL long long
    using namespace std;
    const int N=2e5+5;
    int n,k,p,a[N],ans,res,sum;
    IL int in(){
        char c;int f=1;
        while((c=getchar())<'0'||c>'9')
          if(c=='-') f=-1;
        int x=c-'0';
        while((c=getchar())>='0'&&c<='9')
          x=x*10+c-'0';
        return x*f;
    }
    int main()
    {
        int t=in();
        while(t--){
            n=in(),p=in(),k=in(),ans=0;
            for(int i=1;i<=n;++i) a[i]=in();
            sort(a+1,a+n+1);
            for(int i=0;i<k;++i){
                res=(p-=a[i]),sum=i;
                if(res<0) break;
                for(int j=i+k;j<=n;j+=k)
                  if(res>=a[j]) res-=a[j],sum+=k;
                  else break;
                ans=max(sum,ans);
            }
            printf("%d
",ans);
        }
        return 0;
    }

C

(t)为关键字排序,不严谨地说,对于前(forall i in left[ 1,n-1 ight])个任务,应在(min(t_{i+1}-1,t_i,T))内完成,特别的,所有任务应在(min(t_n,T))内完成,若时间有剩余,则贪心选择之后的(n-i)个任务完成。

({frak{code:}})

    #include<bits/stdc++.h>
    #define IL inline
    #define LL long long
    using namespace std;
    const int N=2e5+5;
    struct hh{
      LL t,op;
      bool operator<(const hh &a) const{
        return t<a.t;}
    }a[N];
    LL n,k,p[N],d[2],T,ans,res,sum,n0,n1,pre[N];
    IL int in(){
        char c;int f=1;
        while((c=getchar())<'0'||c>'9')
          if(c=='-') f=-1;
        int x=c-'0';
        while((c=getchar())>='0'&&c<='9')
          x=x*10+c-'0';
        return x*f;
    }
    int main()
    {
        int t=in();
        while(t--){
          n=in(),T=in(),d[0]=in(),d[1]=in();n0=n1=ans=0;
          for(int i=1;i<=n;++i) a[i].op=in();
          for(int i=1;i<=n;++i) a[i].t=in();
          sort(a+1,a+n+1);
          for(int i=1;i<=n;++i) pre[i]=pre[i-1]+d[a[i].op];
          if(pre[n]<=T){ans=n;goto dd;}
          for(int i=n-1;~i;--i){
            sum=i;if(a[i+1].op) ++n1;else ++n0;
            if(a[i].t==a[i+1].t) continue;
            LL s=a[i+1].t-1;s=min(s,T);
            if(pre[i]>s) continue;
            res=s-pre[i];
            if(n0*d[0]<=res){
                res-=n0*d[0],sum+=n0;
                if(n1*d[1]<=res) sum+=n1;
                else sum+=res/d[1];
                } 
            else sum+=res/d[0];
            ans=max(sum,ans);
            }
            dd:printf("%lld
",ans);
        }
        return 0;
    }

D

先猜(a),得到(n),再猜(n)(b),一次可以推出字符串中(a)(b)的个数,再每次换一个字母猜(n-1)次,最后一次输出答案,共猜了(n+2)次。

({frak{code:}})

    #include<bits/stdc++.h>
    #define IL inline
    #define LL long long 
    using namespace std;
    const int N=3e2+3;
    int n,m,na,nb; 
    char c[N];
    IL int in(){
        char c;int f=1;
        while((c=getchar())<'0'||c>'9')
          if(c=='-') f=-1;
        int x=c-'0';
        while((c=getchar())>='0'&&c<='9')
          x=x*10+c-'0';
        return x*f;
    }
    int main()
    {
        puts("a"),fflush(stdout);
        if(!(n=in())) return 0;
        memset(c+1,'b',n),puts(c+1),fflush(stdout);
        if(!(m=in())) return 0;
        c[++n]='b',na=m;
        for(int i=1;i<n;++i){
            c[i]='a',puts(c+1),fflush(stdout);
            if((m=in())<na) --na;else c[i]='b';
            if(!na) return 0; 
        } 
        c[n]='a',puts(c+1),fflush(stdout),m=in();
        return 0;
    }

以上是关于Codeforces Round #610 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #610 (Div. 2)E(模拟,DFS)

Codeforces Round #610 (Div. 2) a/b/c

Codeforces Round #610 (Div. 2).K for the Price of One (Hard Version)

Codeforces Round #730 (Div. 2) C. Need for Pink Slips(概率,模拟....)

Codeforces Round #467(Div2)题解

Codeforces Round #436 E. Fire(背包dp+输出路径)