zoukankan      html  css  js  c++  java
  • Codeforces Round #671 (Div. 2)(A->D2(构造))

    A:http://codeforces.com/contest/1419/problem/A

    解析:

    稀里糊涂过得,不想说了。。。

    #include <bits/stdc++.h>
    #include<vector>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e5+10;
    vector<int>g[maxn];
    int si[maxn];
    int ok  = 0 ;
    int x,y;
    int main(){
        int t;
        cin >> t;
        while(t--) {
            int n;
            cin>>n;
            char s[1005];
            scanf("%s",s+1);
            int c1=0,c2=0,c3=0,c4=0;
            int vis[1005];
            if(n==1)
            {
                if((s[1]-'0')%2)
                {
                    cout<<"1"<<endl;
                }
                else
                    cout<<"2"<<endl;
                    continue;
            }
            for(int i=1;i<=n;i++)
            {
                if(i%2&&(s[i]-'0')%2==0)
                {
                    c1++;
                }
                if(i%2==0&&(s[i]-'0')%2!=0)
                {
                    c2++;
                }
            }
            if(n%2)
            {
                if(c1<(n/2+1))
                cout<<"1"<<endl;
                else
                cout<<"2"<<endl;
             } else
             {
                 if(c2<(n/2))
                 cout<<"2"<<endl;
                 else
                 cout<<"1"<<endl;
             }
          }
    }

    B:http://codeforces.com/contest/1419/problem/B

    题意:

    给我读懵了。。。

    意思就是,n阶台阶,它的阶数是1~n。

    如果其还含有n个不相交的正方形,即为nice

    给出x个方块,能组成多少个nice?

    解析:

    列了一下,发现第i个nice其阶数为:2^i-1

    根据样例,nice最多30个。

    所以把前30个nice的阶数列出来,根据等差数列求出每一阶所需方块数,存起来。

    对给出的x,从小到大累加方块数即可。

    #include<bits/stdc++.h>
    #include<cmath>
    #define pb push_back
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn=1e5+10;
    const int mod=1e9+7;
    const ll inf=0x3f3f3f3f3f3f3f3f;
    const double eps=1e-14;
    ll a[50],b[maxn];
    ll tot=0;
    void init()
    {
        ll sum=1,x=1;
        for(int i=1;i<=30;i++)
        {
            ll md=pow(2,i)-1;
            ll md2=(md*md+md)/2;
            a[tot++]=md2;
        }
    }
    int main()
    {
        int t;
        cin>>t;
        init();
        while(t--)
        {
            ll n;
            cin>>n;
            
            ll sum=0;
            int cnt=0;
            for(int i=0;i<tot;i++)
            {
                sum+=a[i];
                if(sum<=n)
                    cnt++;
                else
                    break;
            }
            cout<<cnt<<endl;
        }
    }

    C:http://codeforces.com/contest/1419/problem/C

    题意:

    初始被感染的rating为x,除他之外还有n个初始rating。

    每次比赛可以对任意rating进行+-操作,但是总变化数为0。

    感染条件:rating与x相同,每次感染发生在每次比赛前和后。

    求最少比赛数,以感染所有rating

    解析:

    1:所有rating都为x,需要0次

    2:sum==n*x,此时一次比赛,即可把所有数字变成x,需要1次

    3:x在n个初始rating中出现,假设定为id,初始id被感染,然后把除id之外所有非x的rating全变为x,需要补的全安排在id头上(因为总变化数为0),即可感染所有人,需要1次。

    4:初始x没有出现,那么第一步,把n-1个全变为x,需要补的放在最后那个头上,n-1个全被感染。第二步,最后那个变为x即可。总共两步。

    #include<bits/stdc++.h>
    #include<cmath>
    #include<map>
    #define pb push_back
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn=1e3+10;
    const int mod=1e9+7;
    const ll inf=0x3f3f3f3f3f3f3f3f;
    const double eps=1e-14;
    int a[maxn];
    ll tot=0;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n,x;
            int cnt=0;
            cin>>n>>x;
            int ok1=0,ok2=0;
            int sum = 0 ;
            for(int i=1;i<=n;i++)
            {
                cin>>a[i];
                sum+=a[i];
                if(a[i]!=x)
                    ok1=1;
                else
                    ok2=1;
            }
            if(!ok1)
            {
                cout<<"0"<<endl;
            }
            else if(sum==x*n||ok2)
                cout<<"1"<<endl;
            else
                cout<<"2"<<endl;
        }
    }

    D1:http://codeforces.com/contest/1419/problem/D1

    D2:http://codeforces.com/contest/1419/problem/D2

    题意:

    当一个商品小于左边和右边的价格,我们就能购买它,问如何排列商品能让我们能买的最多

    D1价格各不相等,D2可相等。

    解析:

    比赛时D1直接想的是,既然是小于两边,那么小的肯定不能连着排

    所以先对价格排序,从小到大放,先从偶数位开始放,然后余下的按奇数位放。

    D1过了以后就下了,没想到,这套代码同样能过D2,改都不用改,血亏。。。。

    #include <bits/stdc++.h>
    #include<vector>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e5+10;
    vector<int>g[maxn];
    int a[maxn];
    int b[maxn];
    int vis[maxn];
    int ok  = 0 ;
    int x,y;
    int main(){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            b[i]=0;
            vis[i]=0;
        }
        sort(a+1,a+1+n);
        int tot=1;
        for(int i=2;i<=n;i+=2)
        {
            b[i]=a[tot];
            vis[tot]=1;
            tot++;
        }
        int cnt=0;
        tot=1;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                b[tot]=a[i];
                tot+=2;
            }
        }
        int c=0;
        for(int i=2;i<n;i++)
        {
            if(b[i]<b[i-1]&&b[i]<b[i+1])
                c++;
        }
        cout<<c<<endl;
        for(int i=1;i<=n;i++)
            cout<<b[i]<<" ";
            cout<<endl;
    }
  • 相关阅读:
    python的reduce()函数
    python的map()函数
    【RxJS 01】函数式编程
    【vs_dev】01 first one
    【Angular01】Angular First One ----附 ip 地址查询
    目录
    ECMA Script 6 something
    【git】打tag
    【work 0107】dione 搭建
    【nextjs】React SSR
  • 原文地址:https://www.cnblogs.com/liyexin/p/13708678.html
Copyright © 2011-2022 走看看