CF彩笔题解1651 AtoC

A

分析

1<<x即为2^n.第一轮是奇数全胜,后面全剩奇数所以和一定是偶数所以总是数字大的赢.以答案是 1~2^n

范围内最大的奇数

AC代码

#include<iostream>
#include<cmath>
using namespace std;
int a[40];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int x,t=0;
        cin>>x;
        
        cout<<(1<<x)-1<<endl;
    }
    
return 0;} 

 

B

分析

ai-aj要比原来大,,所以一个数至少要是另外一个数字的3 倍,ai=3*aj 就行

AC代码

#include<iostream>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        if(n>19)  puts("NO");//3^19=1,162,261,467
        else 
        {
            puts("YES");
            int t=1;
            for(int i=1;i<=n;i++)
            {
                cout<<t<<endl;
                t*=3;//ai-aj要比原来大,ai=3*aj 
            }
            puts("");
        }
        
    }
    
return 0;}

 

C

分析

最简单的就是形成一个环:

a[1]<--->b[1],a[n]<---->b[n] or a[1]<--->b[n],a[1]<---->b[n]

第二种情况形成多个环:让每一个电脑的度>=2即可,然后是暴力枚举找最优情况

AC代码

#include<iostream>
#include<algorithm>
#include<cmath> 
using namespace std;
typedef long long LL;
const int N=200010;
int a[N],b[N];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        cin>>a[i];
        LL sum=0;
        for(int i=0;i<n;i++)
        cin>>b[i];
        sum=min(abs(a[0]-b[0])+abs(a[n-1]-b[n-1]),abs(a[0]-b[n-1])+abs(a[n-1]-b[0]));
        LL ans1,ans2,ans3,ans4;
        ans1=ans2=ans3=ans4=sum;
        for(int i=0;i<n;i++)
        {
            if(ans1>abs(a[0]-b[i]))
                ans1=abs(a[0]-b[i]);
            if(ans2>abs(b[0]-a[i]))
                ans2=abs(b[0]-a[i]);
            if(ans3>abs(a[n-1]-b[i]))
                ans3=abs(a[n-1]-b[i]);
            if(ans4>abs(b[n-1]-a[i]))
                ans4=abs(b[n-1]-a[i]);
        }
        sum=min(ans1+ans2+ans3+ans4,sum);
        sum=min(ans1+ans2+abs(a[n-1]-b[n-1]),sum);
        sum=min(ans3+ans4+abs(a[0]-b[0]),sum);
        sum=min(ans1+ans4+abs(a[n-1]-b[0]),sum);
        sum=min(ans2+ans3+abs(a[0]-b[n-1]),sum);
        cout<<sum<<endl;        
    }
    
return 0;}
#include<iostream>
#include<algorithm>
#include<cmath> 
using namespace std;
typedef long long LL;
const int N=200010;
int a[N],b[N];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        cin>>a[i];
        LL sum=0;
        for(int i=0;i<n;i++)
        cin>>b[i];
        sum=min(abs(a[0]-b[0])+abs(a[n-1]-b[n-1]),abs(a[0]-b[n-1])+abs(a[n-1]-b[0]));
        LL ans1,ans2,ans3,ans4;
        ans1=ans2=ans3=ans4=sum;
        for(int i=0;i<n;i++)
        {
            if(ans1>abs(a[0]-b[i]))
                ans1=abs(a[0]-b[i]);
            if(ans2>abs(b[0]-a[i]))
                ans2=abs(b[0]-a[i]);
            if(ans3>abs(a[n-1]-b[i]))
                ans3=abs(a[n-1]-b[i]);
            if(ans4>abs(b[n-1]-a[i]))
                ans4=abs(b[n-1]-a[i]);
        }
        sum=min(ans1+ans2+ans3+ans4,sum);
        sum=min(ans1+ans2+abs(a[n-1]-b[n-1]),sum);
        sum=min(ans3+ans4+abs(a[0]-b[0]),sum);
        sum=min(ans1+ans4+abs(a[n-1]-b[0]),sum);
        sum=min(ans2+ans3+abs(a[0]-b[n-1]),sum);
        cout<<sum<<endl;        
    }
    
return 0;}

 

posted @ 2022-03-12 15:11  szf45  阅读(35)  评论(0)    收藏  举报