A. Ancient Civilization
题意:给你n个二进制下长度小于k的数,让你在0到
2
k
−
1
2^k-1
2k−1求一个数,使它和其余数的二进制上的不同的个数最少
思路:暴力做法即可,将所有数转化为二进制,统计每一位上最多的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;
}