Codeforces Round #647 (Div. 2) - Thanks, Algo Muse!

题目链接:http://codeforces.com/contest/1362

 

简单讲解:https://www.bilibili.com/video/BV15C4y1a7e5

A - Johnny and Ancient Computer

//
//  main.cpp
//  CF
//
//  Created by HanJinyu on 2020/5/15.
//  Copyright © 2020 by HanJinyu. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef double db;
typedef long long ll;
const int maxn=2e5+10;
int main()
{
    #ifdef ONLINE_JUDGE
    #else
        freopen("in.txt","r",stdin);
    #endif
    int T;
    scanf("%d",&T);
    while(T--){
    long long a,b;
    scanf("%lld%lld",&a,&b);
    if(a==b)
    {
        printf("0\n");continue;
    }
    else if((a%2!=0)&&(b%2!=0))
    {
        printf("-1\n");continue;
    }
    if(a>b)
    {
        if(a%b!=0)
           printf("-1\n");
        else
           {
               long long ma=a/b;
               if((ma&(ma-1))!=0)
                   printf("-1\n");
               else{
                  ll num=0;
                  ll count=0;
                   while(1)
                   {

                   if (ma>>=1) count++;
                   else
                       break;
                   }
                   if(count==1)
                       num=1;
                   else if(count!=1)
                   {
                       num+=count/3;
                       count%=3;
                       if(count!=0)
                           num++;
                   }
                printf("%lld\n",num);
               }
           }
    }
    else{
        if(b%a!=0)
           printf("-1\n");
        else
        {
            long long maa=b/a;
           if((maa&(maa-1))!=0)
               printf("-1\n");
            else{
              ll num=0;
              ll count=0;
               while(1)
               {

               if (maa>>=1) count++;
               else
                   break;
               }
               if(count==1)
                   num=1;
               else if(count!=1)
               {
                   num+=count/3;
                   count%=3;
                   if(count!=0)
                       num++;
               }
            printf("%lld\n",num);
                }
           }
    }
    }
    return 0;
}
View Code

 

B - Johnny and His Hobbies

//-------------------------------------------------
//Created by HanJinyu
//Created Time :三  5/20 12:29:04 2020
//File Name :question.cpp
//-------------------------------------------------

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef double db;
typedef long long ll;
#define maxn 100000
int main()
{
    #ifdef ONLINE_JUDGE
    #else
    freopen("in.txt","r",stdin);
    #endif
    int t;
    scanf("%d",&t);
    while(t--)
    {
            int a[maxn],b[maxn];
            int n;
            scanf("%d",&n);
            for(int i=0;i<n;i++)
            {
                scanf("%d",a+i);
            }
            sort(a,a+n);
            bool flag=false;
            int num=0;
            for(int i=1;i<=1024;i++)
            {
                bool flag1=false;
                for(int j=0;j<n;j++)
                {
                    b[j]=(a[j]^i);
                }
                sort(b,b+n);
                for(int k=0;k<n;k++)
                {
                    if(a[k]!=b[k])
                    {
                        flag1=true;
                        break;
                    }
                }
                if(!flag1)
                {
                    num=i;
                    flag=true; break;
                }
            }
            if(flag)
                printf("%d\n",num);
            else
                printf("-1\n");
        }
     return 0;
}
View Code

 

C - Johnny and Another Rating Drop

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef double db;
typedef long long ll;
const int maxn = 2e5+10;

long long ee(long long a)
{
    if(a==1)
        return 1;
    else if(a==2)
        return 3;
    return ee(a/2)+a;
}
int main()
{
    #ifdef ONLINE_JUDGE
    #else
    freopen("in.txt","r",stdin);
    #endif
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll n;
        scanf("%lld",&n);
        printf("%lld\n",ee(n));
    }
    return 0;
}
View Code

 

D - Johnny and Contribution

//
//  main.cpp
//  CF
//
//  Created by HanJinyu on 2020/5/15.
//  Copyright © 2020 by HanJinyu. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef double db;
typedef long long ll;
const int maxn=5e5+10;
int main()
{
    #ifdef ONLINE_JUDGE
    #else
        freopen("in.txt","r",stdin);
    #endif
    int n,m;
    scanf("%d%d",&n,&m);
    vector<int>vv[n+20],where[n+20],ans;
    int u,v;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        vv[u].push_back(v);
        vv[v].push_back(u);//连边
    }
    int point[maxn];//所求的权值
    int x;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        where[x].push_back(i);
        point[i]=1;//每个编号目标权值都设置成1
    }
    for(int i=1;i<=n;i++)
    {
        for(auto v1:where[i])//遍历每个目标权值他所对应点额编号
        {
            if(point[v1]!=i)//所求的权值与题目求是否一致,不一致就-1
            {
                printf("-1\n");
                return 0;
            }
            for(auto s:vv[v1])//更新他周围的权值
            {
            
                if(point[s]==i)//只要跟当前的编号就要更新
                    point[s]++;
            }
            ans.push_back(v1);//把编号存入答案
        }
    }
    for(auto v:ans)
        printf("%d ",v);
    printf("\n");
    return 0;
}
View Code

 

posted @ 2020-06-05 12:37  branna  阅读(278)  评论(0编辑  收藏  举报