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\n",(b-a)-(min(b,R)-max(a,L)));
            else printf("%d\n",b-a);
        }
        return 0;
    }

B

考虑购买\(n\)个物品,排序,先选第\(n-k+1\)到\(n\)个物品,花费\(v_n\),再购买物品\(n-k\),以此推类,最后再一个个购买物品\(1\)到\(n\mod 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\n",ans);
        }
        return 0;
    }

C

以\(t\)为关键字排序,不严谨地说,对于前\(\forall i \in \left[ 1,n-1 \right]\)个任务,应在\(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\n",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;
    }

原文地址:https://www.cnblogs.com/yiqiAtiya/p/12126263.html

时间: 2024-10-10 10:50:21

Codeforces Round #610 (Div. 2)的相关文章

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

题目 传送门 A Temporarily unavailable   standard input/output 1 s, 256 MB  给一个线段ab, 问除去 c点圆心半径r覆盖的 线段多长,如果圆在线段外 直接输出 ab 长度就行, 若在线段内 则输出cout << max(b-a-max((min(c+r,b)-max(a,c-r)),0), 0) ,迷糊的话纸上画下大概就能明白.B1 K for the Price of One (Easy Version) , B2 K for

Codeforces Round #610 (Div. 2) 题解

Temporarily unavailable K for the Price of One (Hard Version) Petya and Exam Temporarily unavailable \[ Time Limit: 1 s\quad Memory Limit: 256 MB \] 直接计算出 \([c-r, c+r]\) 在 \([a, b]\) 中的范围有多大,然后减掉就可以了. view #include <map> #include <set> #includ

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

先找到一条多边形的边,然后循环一圈输出多边形上的点.把每个三角形看作一个结点,以两个三角形之间公用边为边建立一张图,DFS输出叶子结点,则得到先切后切的顺序. 1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 vector<int>v[100007]; 5 bool vis[100007]; 6 void dfs(int x){ 7 vis[x]=1; 8 for(au

【排序】【规律】Codeforces Round #254 (Div. 2) - D. Rooter&#39;s Song

D. DZY Loves FFT Source http://codeforces.com/contest/445/problem/D Description Wherever the destination is, whoever we meet, let's render this song together. On a Cartesian coordinate plane lies a rectangular stage of size w?×?h, represented by a re

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除