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;
}