A. Forgetting Things
添加链接描述
这个第一题签到题。题意也很简单,就四种情况直接枚举出来,a+1b时 可以直接输出a ,b。当ab 时直接输出a10 b10+1 当a9 && b1 时 直接输出 9 和 10 就行,其余情况直接输出-1.
代码如下,仅供参考
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int a,b;
cin>>a>>b;
if(a+1==b)
{
cout<<a<<" "<<b<<endl;
}
else if(a==b)
{
cout<<a*10<<" "<<b*10+1<<endl;
}
else if(a==9&&b==1)
cout<<a<<" "<<b*10<<endl;
else
cout<<-1<<endl;
}
B1. TV Subscriptions (Easy Version)
添加链接描述
这道题说的是给你一段序列n 每个数都小于等于k,问你使子数组中的长度为d且种类最小;
这题的数据范围很小,直接暴力开个二维循环就可以。
代码写的可能有点复杂,仅供参考
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int a[n];
int k,d;
cin>>k>>d;
int minn=1e7+7;
int cnt=0;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<=n-d;i++)
{
set<int>q;
for(int j=i;j<i+d;j++)
{
q.insert(a[j]);
}
cnt=q.size();
minn=min(minn,cnt);
q.clear();
}
cout<<minn<<endl;
}
}
B2. TV Subscriptions (Hard Version)
添加链接描述
这题比B1的数据范围更大,不能直接暴力开两重循环,会超时。所以正确的做法是尺取法,每次更新左端点或者右端点的下标。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;
while(t--)
{
int n,k,d;cin>>n>>k>>d;
int a[n];
map<int,int> mp;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<d;i++)
mp[a[i]]++;
int p=mp.size();
int l=p;
for(int i=d;i<n;i++)
{
if(--mp[a[i-d]]==0) --p;
if(++mp[a[i]]==1) ++p;
if(p<l) l=p;
}
cout<<min(l,p)<<endl;
}
}
C. p-binary
添加链接描述
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll count(ll x)
{
int ans=0;
while(x)
{
ans++;
x&=(x-1);
}
return ans;
}
int main()
{
ll n,p;
cin>>n>>p;
int cnt=0;
int flag=0;
for(int i=1;i<1000;i++)
{
if(i>=count((n-i*p))&&i<=(n-i*p))
{
cout<<i<<endl;
flag=1;
break;
}
}
if(flag==0)
cout<<-1<<endl;
}
D. Power Products
添加链接描述
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define m_p make_pair
int main(){
ll n,x,k;
vector<pair<ll,ll> > a,b;
map<vector<pair<ll,ll> >,ll> mp;
cin>>n>>k;
ll ans=0;
for(ll i=0;i<n;i++){
cin>>x;
for(ll j=2;j*j<=x;j++){
ll cnt=0;
while(x%j==0){
cnt++;
x/=j;
}
if(cnt%k)
a.push_back(m_p(j,cnt%k));
}
if(x>1){
a.push_back(m_p(x,1));
}
for(ll j=0;j<a.size();j++){
b.push_back(m_p(a[j].first,k-a[j].second));
}
ans+=mp[b];
mp[a]++;
a.clear();
b.clear();
}
cout<<ans<<endl;
}