Codeforces Round #596 ABC题解

A 题

思路:只要判断三种情况,a等于b或者a+1等于b或者a等于9且b等于1时,否则输出-1;

include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx=10;
int main()
{    
    int n,m;   
    cin>>n>>m;
        if(n==m)
           cout<<n*10+1<<" "<<m*10+2<<endl;   
        else  if(n==9&&m==1)    
           cout<<99<<" "<<100<<endl;   
        else if(n+1==m)   
           cout<<n*10+9<<" "<<m*10<<endl;
        else        
           cout<<-1<<endl;  
      return 0;
}

B题

思路:一开始我们先判断第一天到第d天,当第一次购买影片版权时结果ans就是加一,当我们移动到第二天到第d+1天时,我们要把第一天的影响消掉,我们就把第一天购买是影片版权减一,如果减了以后为0,ans就要减一(思考一下为什么,我们可以想一下,当不要第一天的类型时,它的购买次数为0,说明我们总的ans就少了一。)求出第二天到第d+1天时后,我们就要和之前的比大小,保留最小值,以此类推。

#include<iostream>
#include<algorithm>
#include<map>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const int mx=1e6+10;
int a[mx],b[mx];
int main()
{
   int t,n,m,d,ans,sum,tt;
    cin>>t;
   while(t--)
   {
        ans=sum=0;
       cin>>n>>m>>d;
       memset(b,0,(m+2)*sizeof(int));
       for(int i=1;i<=n;i++)
       {
           scanf("%d",&a[i]);
       }
       for(int i=1;i<=d;i++)
       {
           if(++b[a[i]]==1) ans++;
       }
       sum=ans;
       for(int i=d+1;i<=n;i++)
       {
           if((--b[a[i-d]])==0) ans--;
           if((++b[a[i]])==1) ans++;
           if(ans<sum)
            sum=ans;
       }
       cout<<sum<<endl;
   }
   return 0;
}

C题

思路:
我们可以把题目转化成,求n-k×p里的二进制数为一的数目ans,当ans小于k时。(想想,k是题目要求的结果,数目ans上的位可以变成下一位的二个。所以当ans小于k时其实是满足题目要求的,前提是n-k×p大于ans才能变)

#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn = 1e8;
int main()
{
    int t,n,ans=0,m,p;
    cin>>n>>p;
       while(n - ans * p > 0){
        if (__builtin_popcountll(n - ans * p) <= ans){//__builtin_popcountll是计算二进制中多少个1,当然你也可以手写
            if (n - ans * p >= ans){
                cout << ans << "\n";
                return 0;
            }
        }
        ans ++ ;
        }
        cout << "-1\n";
       return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值