• Codeforces #298题解


    A题

    有很多可行的构造方法,我是采取的对于每个数 i 和 i+n/2配对的方式。对于4特别处理,为2 4 1 3。

    #include<iostream>
    #include<string>
    using namespace std;
    int main()
    {
        int n;
        cin>>n;
    
        if(n==1)
        {
            cout<<1<<endl;
            cout<<1<<endl;
        }
        else if(n==2)
        {
            cout<<1<<endl;
            cout<<1<<endl;
        }
        
        else if(n==3)
        {
            cout<<2<<endl;
            cout<<"1 3"<<endl;
        }
        else if(n==4)
        {
            cout<<4<<endl;
            cout<<"2 4 1 3"<<endl;
        }
        else
        {
            if(n%2==0)
            {
                cout<<n<<endl;
                cout<<1<<" "<<1+n/2;
                for(int i=2;i<=n/2;i++)
                cout<<" "<<i<<" "<<i+n/2;
                cout<<endl;
            }
            else
            {
                cout<<n<<endl;
                for(int i=1;i<(n+1)/2;i++)
                cout<<i<<" "<<i+(n+1)/2<<" ";
                cout<<(n+1)/2;
                cout<<endl;
            }
        }
    }

    B:对于每个d>=i>=-d枚举,取可以满足在剩余的时间内可以达到v2的最大值。即贪心法则。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int v1,v2;
    int t,d,sum;
    int main()
    {
        cin>>v1>>v2>>t>>d; 
        if(v2 < v1)
        swap(v1,v2);
        sum=v1;
        for(int i=2;i<=t;i++)
        {
            for(int j=d;j>=-d;j--)
            {
                if(v1+j-(t-i)*d<=v2)
                {
                    v1+=j;
                    break;
                }
            }
            sum+=v1;
        }
        cout<<sum<<endl;
        return 0;
    }

    C:先求出上限(除了自己之外,其他至少为1时)Max,因为数据为10^5,所以预先处理出sum[i],前i项和。这样对于每个取下限的时候,可由tot和sum[]算出。

    注意下限temp<0的情况特殊处理一下。

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    long long sum[200004];
    long long s[200004];
    int main()
    {
        long long n,tot;
        cin>>n>>tot;
        long long  k=tot-(n-1);
        sum[0]=0;
        for(long long i=1;i<=n;i++)
        {
            cin>>s[i];
            if(s[i]>=k)
            sum[i]=sum[i-1]+k;
            else
            sum[i]=sum[i-1]+s[i];
        } 
        long long  first=0;
        for(long long  i=1;i<=n;i++)
        {
           long long  ans=0;
            if(s[i]>k)
            ans+=(s[i]-k);
            
            long long temp=tot-(sum[n]-(sum[i]-sum[i-1]));
            if(temp-1<=0)
            temp=1;
            ans+=min(temp-1,s[i]);
            if(first++)
            cout<<" "; 
            cout<<ans;
        }
        cout<<endl;
    }

    D:先从0开始,若当前的值>=3,但是在序列中找不到,则只能-3,也就是说只会出现握手的人数+1和握手的人数-3这两种情况。若还是找不到,则输出impossible。

    #include<iostream>
    #include<string>
    #include<queue>
    using namespace std;
    queue<int> q[200005];
    int res[200005];
    int main()
    {
        int n,num;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>num;
            q[num].push(i);
        }
        int cur=0;
        for(int i=1;i<=n;i++)
        {
            while(q[cur].empty()&&cur>=3)
            cur-=3;
            while(q[cur].empty())
            {
                cout<<"Impossible"<<endl;
                return 0;
            }
            int temp=q[cur].front();
            q[cur].pop();
            res[i]=temp;
            cur++;
            
        }
        int first=0;
        cout<<"Possible"<<endl;
        for(int i=1;i<=n;i++)
        {
            if(first++)
            cout<<" ";
            cout<<res[i];
        }
        cout<<endl;
        
    }

    E:等待更新

  • 相关阅读:
    前端开发规范:命名规范、html 规范、css 规范、js 规范
    node.js入门系列(一)--Node.js简介
    浅析前端开发中的 MVC/MVP/MVVM 模式
    网页加载进度条的实现
    JavaScript深入系列(一)--原型和原型链详解
    vue2.0项目实战(5)vuex快速入门
    既然写CSS很容易,那为什么大家还是把CSS写的那么烂呢?
    vue2.0项目实战(4)生命周期和钩子函数详解
    vue2.0项目实战(3)使用axios发送请求
    【css技能提升】完美的 Sticky Footer 布局
  • 原文地址:https://www.cnblogs.com/Tach-ac/p/4427370.html
Copyright © 2020-2023  润新知