Codeforces Round #633 (Div. 2)

地址: https://codeforces.com/contest/1339

     解析:最近a题题意都好长啊.....这道题直接看有几个竖着的菱形就可以了,输入n,输出n。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=3e5+100;
ll v[maxn];
ll a[maxn],b[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n;
        cin>>n;
        cout<<n<<endl;
    }
}

     题意:将给出的数列进行重新排列,使两两之间的差逐渐增大。

     解析:排个序,从中间向两边扩散取就可以了,每次取这个数和它在右边对应的数。注意n是奇数的时候,先把a[mid]打印出来。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
ll a[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        ll x;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        sort(a,a+n);
        int mid=n/2;
        if(n%2!=0)
            cout<<a[mid]<<" ";
        for(int i=mid-1;i>=0;i--)
        {
            if(i>0)
            cout<<a[i]<<" "<<a[n-1-i]<<" ";
            else
            cout<<a[i]<<" "<<a[n-1-i]<<endl;
        }
    //    cout<<endl;
    }
}

     题意:那个aij我是没看懂什么意思。不过不影响理解题意,就是说第x秒可以对任意几个位置+2^(x-1)。要求把整个数列变成非递减数列,最快需要几秒。

     解析:取最大递减差值maxx,看从0到maxx需要多少秒即可。注意求这个maxx,不能O(n*n)地找,我就在这里T了一次。只要一个for里每次更新最大值mx和最大差值即可。因为对于当前a[i],最大值要么在它头上,要么在它前面,在它头上,就说明当前位置之前没有出现递减现象。在它前面,就说明出现了递减,更新这个差值,每次max取最大差值即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
const int minnx=2e9;
ll a[maxn];
ll v[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%lld",&a[i]);
        int ok=0;
        for(int i=1;i<n;i++)
        {
            if(a[i-1]>a[i])
            {
                ok=1;break;
            }
        }
        if(!ok)
        {
            cout<<"0"<<endl;continue;
        }
        ll mx=a[0],maxx=0;
        for(int i=0;i<n;i++)
        {maxx=max(maxx,mx-a[i]);
            mx=max(mx,a[i]);
            
        }
        ll cnt=0,k=1;
        ll sum=0;
        while(1)
        {
            sum+=k;
            cnt++;
            k=k*2;
            if(sum>=maxx)
                break;
        }
        cout<<cnt<<endl;
    }
}
原文地址:https://www.cnblogs.com/liyexin/p/12692774.html