Codeforces Round #633 (Div. 2)题解

A. Filling Diamonds

题意:问 $n$个菱形方块拼成所示的钻石的方案

思路:很明显的是每个图形中有$n$个站着的菱形,选择其中一个其他都会变成躺着的,因此答案为$ n $

#include<iostream>
#include<cstdio>
 using namespace std;
int main(){
    int t,x;
    cin>>t;
    while(t--){
        cin>>x;
        cout<<x<<endl;
    }
    return 0;
}
View Code

B - Sorted Adjacent Differences

题意:给一个数组,要求重新排列后,相邻元素的绝对值不递减

思路:排序后将数组倒着一小一大放置即可

#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
 using namespace std;
 typedef long long ll;
 const int maxn=1e5+10;
 ll a[maxn],ans[maxn];
 int main()
 {
     int t,n;
     scanf("%d",&t);
     while(t--){
         scanf("%d",&n);
         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
         sort(a+1,a+1+n);
         int l=1,r=n;
         for(int i=n;i>=1;i--){
             if((n-i)%2==0){
                 ans[i]=a[l++];
             }
            if((n-i)%2==1){
                ans[i]=a[r--];
            }
         }
        for(int i=1;i<=n;i++){
            if(i!=1) printf(" ");
            printf("%d",ans[i]);
        } 
        cout<<endl;
     }
     return 0;
 }
View Code

C - Powered Addition

题意:给一个数组,你可以在第$ x $秒给一些元素加上$2^{x-1}$ ,问多少秒后数组可以变成一个不递减序列

思路:找到数组中一组前后差最大的元素即可,然后判断需要加几秒即可

#include<iostream>
#include<algorithm>
 using namespace std;
 const int maxn=1e5+10;
 int a[maxn];
 int main()
 {
     int t,n;
     scanf("%d",&t);
     while(t--){
         scanf("%d",&n);
         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
         int mi=a[n],flag=0,ret=0;
         for(int i=n-1;i>=1;i--){
             if(a[i]>mi) flag=1,ret=max(ret,a[i]-mi);
             else mi=min(a[i],mi);
         }
        if(!flag) cout<<0<<endl;
        else{
            int x=1,cnt=0;
            while(ret>0){
                ret-=x;
                x*=2;
                cnt++;
            }
            cout<<cnt<<endl;
        }
     }
    return 0;
 }
View Code

猜你喜欢

转载自www.cnblogs.com/overrate-wsj/p/12690953.html