zoukankan      html  css  js  c++  java
  • Codeforces Global Round 3

    A. Another One Bites The Dust

    有三种序列 a b ab   给出各数量

    求连成的最长长度 (相邻两个字符不同)

    签到水题:

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 2147483647
    const int N=1e6;
    const int M=1e6;
    
    int main()
    {
        ll a,b,c;
        cin>>a>>b>>c;
    
        ll ans=2*c;
        ans+=min(a,b)*2;
        if(a!=b)ans+=1;
        cout<<ans;
    
        return 0;
    }
    View Code

    B. Born This Way*

    题意:有两条航线  航线1 :a-b  航线2:b-c

    有人要从a-c  

    给出各个航线的起始时间  和两个t(表示两种航线的航线时间   航线相同的航行时间相同)

    你可以取消k次   让该人到达时间最晚(不能到达输出-1)

     

    挺好的一题, 题目给出的时间为递增  显然是二分

    但还是想错了两次  在这题浪费了太多时间QAQ 

    可以枚举航线1删除的个数  t   显然删除的方法只有一种 那就是从1开始删除t个   然后下面二分查找就解决了。。。

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 2147483647
    const int N=1e6;
    const int M=1e6;
    
    ll a[N],b[N],t1,t2,k,n,m;
    
    int main()
    {
        cin>>n>>m>>t1>>t2>>k;
    
        rep(i,1,n)scanf("%lld",&a[i]),a[i]+=t1;
        rep(i,1,m)scanf("%lld",&b[i]);
    
        if(n<=k||m<=k){printf("-1");return 0;}
    
        ll ans=0;
        rep(i,0,k)
        {
            int pos=lower_bound(b+1,b+1+m,a[1+i])-b;
            pos+=(k-i);
            if(pos>m){printf("-1");return 0;}
            ans=max(ans,b[pos]+t2);
        }
        cout<<ans;
    
        return 0;
    }
    View Code

    C. Crazy Diamond*

    给定一个1-n的乱序序列  n为偶数

    要求通过操作  使得有序化

    输出操作的过程(不要求操作最小化)

    其实思路很好想  就是一个贪心  中间两个是最难放的  从中间开始即可

    编码浪费了太多时间。。。。

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 2147483647
    const int N=1e6;
    const int M=1e6;
    
    int a[N],L,R,n,cnt,ans[N][2],pos[N];
    
    void change(int x,int y)
    {
        ans[++cnt][0]=x;
        ans[cnt][1]=y;
        swap(a[x],a[y]);
        swap(pos[ a[x] ],pos[ a[y] ]);
    }
    int main()
    {
        RI(n);
        rep(i,1,n)RI(a[i]),pos[ a[i] ]=i;
        L=n/2;R=L+1;
        int key=n/2;
        rep(i,1,key)
        {
            if(pos[L]!=L)
            {
                if(abs(pos[L]-L)>=key)
                change(pos[L],L);
                else
                {
                    if(abs(pos[L]-1)>=key)
                    change(pos[L],1);
                    if(abs(pos[L]-n)>=key)
                    change(pos[L],n);
                    if(abs(pos[L]-L)>=key)
                    change(pos[L],L);
                }
            }
            if(pos[R]!=R)
            {
                if(abs(pos[R]-R)>=key)
                change(pos[R],R);
                else
                {
                    if(abs(pos[R]-n)>=key)
                    change(pos[R],n);
                    if(abs(pos[R]-1)>=key)
                    change(pos[R],1);
                    if(abs(pos[R]-R)>=key)
                    change(pos[R],R);
                }
            }
            L--;R++;
        }
        cout<<cnt<<endl;
        rep(i,1,cnt) printf("%d %d
    ",ans[i][0],ans[i][1]);
        return 0;
    }
    View Code

     D. Dirty Deeds Done Dirt Cheap

    题意:给出n对数  要求摆成  如下两种之一

    求最长的长度 并输出其摆放方式

      比赛的时候漏看了题目的一条关键信息  导致一直在找特殊情况 (实际上是不存在的)

    关键信息:

    统计上升对数和下降对数的个数  输出大的那一个

    输出方案的化进行排序即可(以x 或y 为关键字都行)

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 2147483647
    const int N=1e6;
    const int M=1e6;
    
    int ans1,ans2,n,num[N][2];
    
    struct node
    {
        int x,y,id;
    }a[N],b[N];
    
    bool cmp1(node a,node b)
    {
        return a.y<b.y;
    }
    bool cmp2(node a,node b)
    {
        return a.x>b.x;
    }
    int main()
    {
        RI(n);
        rep(i,1,n)
        {
            RII(num[i][0],num[i][1]);
            if(num[i][0]>num[i][1])
            a[++ans1]=node{num[i][0],num[i][1],i};
            else b[++ans2]=node{num[i][0],num[i][1],i};
        }
        if(ans1>ans2)
        {
            cout<<ans1<<endl;
            sort(a+1,a+1+ans1,cmp1);
            rep(i,1,ans1)printf("%d ",a[i].id);
        }
        else
        {
            cout<<ans2<<endl;
            sort(b+1,b+1+ans2,cmp2);
            rep(i,1,ans2)printf("%d ",b[i].id);
        }
        return 0;
    }
    View Code

     E. Earth Wind and Fire**

     

     

    题意: 有一种操作  数字大的可以给数字小的一些数字值  但是大的始终得是大的。。

    要求上面的n个数经过操作变成下面的n个数  (且上下都为可重集合   所以是无序的!!! 一开始根本没发现)

    因为可以无序  所以排序处理

    从前往后扫  求其 需求的 前缀和   因为前面的不能给后面  所以如果前缀和为负数  也就是溢出了需求  那么无解

    然后缺的压入栈  多的开始处理补

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 2147483647
    const int N=1e6;
    const int M=1e6;
    struct node
    {
        int x,y,d;
    }ans[N];
    int n,a[N],b[N],pos[N],sta[N],ind,cnt;
    ll s[N];
    bool cmp(int i,int j)
    {
        return a[i]<a[j];
    }
    int main()
    {
        RI(n);
        rep(i,1,n)RI(a[i]),pos[i]=i;
        rep(i,1,n)RI(b[i]);
        sort(pos+1,pos+1+n,cmp);
        sort(a+1,a+1+n);
        sort(b+1,b+1+n);
        rep(i,1,n)a[i]=b[i]-a[i];
        rep(i,1,n)s[i]=s[i-1]+a[i];
        rep(i,1,n)if(s[i]<0)return puts("NO"),0;
        if(s[n])return puts("NO"),0;
    
        rep(i,1,n)
        {
            if(a[i]>0){sta[++ind]=i;}
            else if(a[i]<0)
            {
                int d=-a[i];
                while(ind&&a[ sta[ind] ]<d)
                {
                    ans[++cnt]=node{sta[ind],i,a[sta[ind]]};
                    d-=a[ sta[ind] ];
                    ind--;
                }
                if(d)ans[++cnt]=node{ sta[ind],i,d },a[sta[ind]]-=d;
            }
        }
        puts("YES");
        cout<<cnt<<endl;
        rep(i,1,cnt)
        printf("%d %d %d
    ",pos[ans[i].x],pos[ans[i].y],ans[i].d);
    
        return 0;
    }
    View Code

    红名的大神一小时就五题了QAQ 

     

     

  • 相关阅读:
    超详细动画彻底掌握深度优先,广度优先遍历!
    拜托,别再问我什么是 B+ 树了
    高性能短链设计
    Gradle build 太慢,可能是你使用的姿势不对
    看完这些,你也能成技术专家
    x58平台 服务器电源配置 tdp
    系统掉盘,机械硬盘掉盘,固态掉盘
    centos7 修改ip和dns
    centos 修改hostname
    TCP三次握手和四次挥手过程
  • 原文地址:https://www.cnblogs.com/bxd123/p/10962536.html
Copyright © 2011-2022 走看看