zoukankan      html  css  js  c++  java
  • Codeforces Round #598 (Div. 3)

    小牧心情不好,还想接着写点东西,那就再写一次训练的题目解析吧

    A题

    思维题,简单搞一搞

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 
     6 using namespace std;
     7 int main()
     8 {
     9     int q;
    10    scanf("%d",&q);
    11     while(q--)
    12     {
    13         int a,b,n,s;
    14         scanf("%d%d%d%d",&a,&b,&n,&s);
    15         int d = s/n;
    16         int p = s - min(d,a)*n;
    17         if(b>=p){
    18             printf("YES
    ");
    19         }
    20         else{
    21             printf("NO
    ");
    22         }
    23     }
    24 }
    View Code

    B题

    题意:给你一个长度为n的数组,最多每个位置只能改变一次(就是当前值和前面的数交换),求改变后的最小字典序

    思路:我们从后往前开始遍历尽可能把小的数往前穿,然后每个穿的位置都标记一下,再把没有穿的位置判断一下,看看可不可以在交换一下,不可以是就输出了

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <cmath>
     6 #include <algorithm>
     7 
     8 using namespace std;
     9 typedef long long ll;
    10 int main()
    11 {
    12     int q;
    13     cin >> q;
    14     while(q--)
    15     {
    16         int n;
    17         int a[110],b[110];
    18         cin >> n;
    19         for(int i=1;i<=n;i++)
    20         {
    21             scanf("%d",&a[i]);
    22             b[i]=0;
    23         }
    24         int d =n-1;
    25         while(d)
    26         {
    27             int flag =0;
    28             for(int i=n;i>1;i--)
    29             {
    30                 if(a[i]<a[i-1]&&b[i-1]==0)
    31                 {
    32                     int t=a[i-1];
    33                     a[i-1]=a[i];
    34                     a[i]=t;
    35                     d--;
    36                     b[i-1]=1;
    37                     flag=1;
    38                     if(d==0)break;
    39                 }
    40             }
    41             if(!flag||!d)break;
    42         }
    43         for(int i=1;i<n;i++)
    44         {
    45             printf("%d ",a[i]);
    46         }
    47         printf("%d
    ",a[n]);
    48     }
    49     return 0;
    50 }
    View Code

    C题

    题意:给出一个河的跨度n,有m个木板,以及没可以跳的跨度,给出m个数,表示木板长度还有跳的宽度d输出所有木板的位置,没有木板的地方输出0

    思路;先把所有的水域求出来,就是没有木板的长度,然后每个木板,最多可以跳m+1次,因此如果水域k >(d-1)*(m+1),就过不了河,否则可以过河,每隔min(d-1,k/(m+1))个水域加一道木板

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <string>
    #include <algorithm>
    #include <map>
    #include <vector>
    #include <queue>
    
    using namespace std;
    typedef long long ll;
    int a[1010];
    int main()
    {
        int n,m,d;
        cin >> n >> m >> d;
        int sum=0;
        for(int i=1;i<=m;i++)
        {
            cin >> a[i];
            sum+=a[i];
        }
        int q = ceil((n-sum)*1.0/(m+1));
        if((d<=q))
        {
            cout<<"NO"<<endl;
            return 0;
        }
        else{
            cout << "YES"<<endl;
            int num =1;
            for(int i= 1;i<=m;i++)
            {
                int j = min(d-1,n-sum);
                for(int k=0;k<j;k++)
                    cout<<0<<' ';
                for(int k=0;k<a[i];k++)
                {
                    cout<<num<<' ';
                }
                num++;
                sum+=j;
            }
        }
        for(int i=0;i<n-sum;i++)cout<<0<<' ';
        return 0;
    }

    D题

    题意:给你一个长度为n的0,1序列,可以交换m次,只能相邻的可以交换,求经过交换后得到的最小字典序数列

    思路;我们就是要经过m次交换尽可能的把0调到最前面

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <algorithm>
    
    using namespace std;
    typedef long long ll;
    int main()
    {
        int q;
        cin >> q;
        while(q--)
        {
            ll n,d;
            cin >> n >> d;
            string s;
            cin >> s;
            ll num=0,cun=0;
            int end_i=0,end_j=0;
            for(int i = 0 ;i<n;i++)
            {
                if(s[i]=='0')
                {
                    num +=(i-cun);
                    s[i]='1';
                    cun++;
                    //cout << num<<endl;
                    if(num>d)
                    {
                        //cout<<"sfew"<<endl;
                        cun--;
                        num-=i-cun;
                        d=d-num;
                        s[i]='1';
                        end_i=i-d;
                        s[i-d]='0';
                        break;
                    }
                }
            }
           // cout <<cun<<"wfw"<<endl;
            //if(cun)
            //cout << cun<<endl;
            for(int i=0;i<cun;i++)cout<<0;
            for(int i=cun;i<n;i++)
            {
              cout<<s[i];
            }
            cout<<endl;
        }
        return 0;
    }
    你的脸上风淡云轻,谁也不知道你的牙咬得有多紧。你走路带着风,谁也不知道你膝盖上仍有曾摔过的伤的淤青。你笑得没心没肺,没人知道你哭起来只能无声落泪。要让人觉得毫不费力,只能背后极其努力。我们没有改变不了的未来,只有不想改变的过去。
  • 相关阅读:
    hive order、sort、distribute、cluster by区别与联系
    hive over窗口函数的使用
    hive中row_number() rank() dense_rank()的用法
    hive中文乱码问题
    hive分桶表的学习
    hive的调优经验
    Hive的学习
    hive grouping sets和GROUPING__ID的用法
    hive修复分区或修复表 以及msck命令的使用
    Vue中使用websocket
  • 原文地址:https://www.cnblogs.com/wangzhe52xia/p/11827937.html
Copyright © 2011-2022 走看看