题意:
给你一个长度为n的数,可以改变m个位置上的数,问你最后这个数的最小值,不能存在前缀0
题解:
!!!考虑第一位是否为1,如果为1,后面的n-1位依次判断是否位0,不为0改为0
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 200010;
char s[maxx];
int main()
{
int n,k;
cin>>n>>k;
getchar();
scanf("%s",s+1);
if(n == 1 && k >= 1){
cout<<"0"<<endl;
return 0;
}
if(k && s[1] != '1'){
s[1] = '1';
k--;
}
if(k == 0){
for(int i=1;i<=n;i++){
cout<<s[i];
}
return 0;
}
for(int i=2;i<=n;i++)
{
if(s[i] == '0'){
continue ;
}
s[i] = '0';
k--;
if(k == 0){
break;
}
}
for(int i=1;i<=n;i++){
cout<<s[i];
}
return 0;
}
题意:
给你21个多米诺骨牌,给出n个点和m条边,问你最多在多少条边上放置多米诺骨牌,每个牌只能用一次。
并且要保证每个点对应的多米诺骨牌的点数一样。
题解:
n小于等于6的时候直接输出m
n等于7的时候,直接考虑每个点可以取1,1,2,3,4,5,6的任意一个,和给出的边比较,求最大值
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 30;
int a[maxx],b[maxx];
int v[maxx];
int ans[7][7];
int main()
{
int n,m;
cin>>n>>m;
if(m == 0){
cout<<"0"<<endl;
return 0;
}
for(int i=1;i<=m;i++)
{
cin>>a[i]>>b[i];
}
if(n <= 6){
cout<<m<<endl;
return 0;
}
string s = "1123456";
int maxn = 0;
do{
for(int i=1;i<=6;i++){
for(int j=i;j<=6;j++)
ans[i][j] = 0;
}
int cnt = 0;
for(int i=1;i<=7;i++){
v[i] = s[i-1]-'0';
}
for(int i=1;i<=m;i++)
{
int x = v[a[i]],y = v[b[i]];
if(x > y)
swap(x,y);
if(!ans[x][y]){
ans[x][y] = 1;
cnt++;
}
}
if(cnt > maxn){
maxn = cnt;
}
}while(next_permutation(s.begin(),s.end()));
cout<<maxn<<endl;
return 0;
}
题意:
有n个人,每个人有ai和bi,ai对应的二进制为1的点代表他会这个算法,bi对应这个人的智力值
老师要求在这n个人中,选出至少俩个人组成一组,使得智力值最大,输出最大的智力值
要求这个组里不存在比组里的其他所有人都聪明的人,比别人聪明,即自己会的算法别人不会,俩个人可以都比对方聪明,比如01和10
题解:
正确的思路是,要找至少有俩个人会的算法完全相同,然后塞进这个组,然后找子集就行了。这里的&运算表示如果a&b == b,表示二进制b上位置为1在a上一定也为1
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 70005;
int n;
map<ll ,ll > mp,mp1;
ll a[maxx],b[maxx],ans[maxx],pos[maxx],k = 0,cnt = 0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]]++;
if(mp[a[i]] >= 2 && !mp1[a[i]]){
ans[++cnt] = a[i];
mp1[a[i]] = 1;
}
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=cnt;i++){
for(int j=1;j<=n;j++){
if((ans[i]&a[j]) == a[j])//
pos[j] = 1;
}
}
for(int i=1;i<=n;i++){
if(pos[i]){
k += b[i];
}
}
cout<<k<<endl;
return 0;
}