Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) A~D题解

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值