Codeforces Round #765 (Div. 2) A~B

A. Ancient Civilization

题意:给你n个二进制下长度小于k的数,让你在0到 2 k − 1 2^k-1 2k1求一个数,使它和其余数的二进制上的不同的个数最少
思路:暴力做法即可,将所有数转化为二进制,统计每一位上最多的0或1,即为答案二进制的结果

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll t;
ll n,k;
ll P(ll x)//防止数据过大爆掉
{
	ll ans = 1;
	for(int i = 1 ; i <= x ; i ++ )	ans *= 2;
	return ans - 1;
}
string to1(ll x)
{
	int arr[1000];
	int c = 0;
	while(x){
		arr[c] = x % 2;
		c++;
		x = x / 2;
	}
	string s = "";
	for(int i = c - 1 ; i >= 0 ; i -- )
	{
		s += to_string(arr[i]);
	}
	return s;
}
string to_er(ll x,int len)
{
	int arr[1000];
	int c = 0;
	while(x){
		arr[c] = x % 2;
		c++;
		x = x / 2;
	}
	string s = "";
	for(int i = len - 1; i >= 0 ; i -- )
	{
		if(i >= c)	s += "0";
		else s += to_string(arr[i]);
	}
	return s;
}
int main()
{
	cin>>t;
	while(t--)
	{
		ll a[110];
		string s[110];
		memset(a,0,sizeof a);
		cin>>n>>k;
		ll f = P(k);
		for(int i = 0 ; i < n ; i ++ )	cin>>a[i];
		sort(a,a+n);
		s[n-1] = to1(a[n-1]);
		int len = s[n-1].size();//便于后面的补0操作
		for(int i = n - 2 ; i >= 0 ; i -- )
		{
			s[i] = to_er(a[i],len);
		}
		// for(int i = 0; i < n ; i ++ )	cout<<s[i]<<"\n";
		map<char,int> mp;
		string s1 = "";
		int arr[100],c = 0;
		for(int i = 0 ; i < len ; i ++ )
		{
			mp.clear();
			for(int j = 0 ; j < n ; j ++ )
			{
				mp[s[j][i]] ++ ;//统计该位上哪一个最多
			}
			if(mp['1'] > mp['0'])	arr[c++] = 1;
			else arr[c++] = 0;
		}
		ll ans = 0 , cnt = 0;
		for(int i = c - 1; i >= 0 ; i --  )
		{
			ans += arr[i]*pow(2,cnt++);
		}
		cout<<ans<<"\n";
	}	
	return 0;
}

B - Elementary Particles

题意:就是要你找到能够让两个长度相同子串有某个同一位置的数字相同,求那个最大的子串长度
在这里插入图片描述
思路:临近的两个相同的一定是最优的,所以用pair存数字和下标,排序,暴力求解

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 150000 + 10;
ll t;
ll n;
int a[N];
map<int,int> mp;
int main()
{
	ios
	cin>>t;
	while(t--)
	{
		cin>>n;
		vector<PII> ve;
		for(int i = 1 ; i <= n ; i ++ )
		{
			int x;
			cin>>x;
			ve.push_back({x,i});
		}
		ll ans = -1;
		sort(ve.begin(),ve.end());//以first排序
		for(int i = 0 ; i < n - 1; i ++ )
		{
			// cout<<ve[i].first<<" ";
			if(ve[i].first == ve[i+1].first)//相邻的为彼此最优情况
			{
				// cout<<ve[i].second<<" "<<ve[i+1].second<<"\n";
				ans = max(ans,n - ve[i+1].second + ve[i].second);//公式
			}
		}
		cout<<ans<<"\n";
	}	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值