1.
/*
与运算 &
1010
&0110
-----
0010
用来获取某个数在2进制状态下某一位的值
a&1=1 a是奇数
a&1=0 a是偶数
或运算 |
1010
|0110
-----
1110
对某个数在2进制下某一位强行赋值
异或 ^
1010
^0110
-----
1101
^0110
-----
1010
异或 相同为0,不同为1
(a^b)^b=a
非 ~
一个数0变1,1变0
移位 <<、>>
lowbit函数
int lowbit(int a){
return a&(-a)
}
b是a在2进制状态下 从右向左第一个2的位置
b=lowbit(10100)//10100:二进制
b:100//100:二进制
*/
2.
#include <iostream>
using namespace std;
int n,a[20]/*初始状态*/,ans;
int lowbit(int a){
return a&(-a);
}
void dfs(int num,int now,int ld,int rd){
if(now==(1<<n)-1){//每一列都不可以放东西(n=4->now=1111)
ans++;
return;
}
int tot=(((1<<n)-1)&(~(now|ld|rd|a[num])/*0不可以*/)/*将前面多余的1去掉*/);
while(tot){/*还可以放*/
int tox=lowbit(tot);
tot=tot-tox;
dfs(num+1,now+tox,(ld+tox)>>1,(rd+tox)<<1);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
char s[20];
scanf("%s",s+1);//初始位置从1开始
for(int j=1;j<=n;j++){
if(s[j]=='.')
a[i]|=(1<<(n-j));
}
}
dfs(1,0,0,0);
cout<<ans;
return 0;
}
3.
#include<bits/stdc++.h>
int n,m,ans,x,a1=0,a2=-1;
char str[5];
int main(){
scanf("%d%d",&n,&m);
while(n--){
scanf("%s%d",str,&x);
if(str[0]=='A') a1&=x, a2&=x;
if(str[0]=='X') a1^=x, a2^=x;
if(str[0]=='O') a1|=x, a2|=x;
}
for(int j=29;~j;--j){
if(a1>>j&1) ans+=1<<j;
else if(a2>>j&1&&(1<<j)<=m) ans+=1<<j, m-=1<<j;
} printf("%d",ans);
return 0;
}
4.
#include <iostream>
#include<algorithm>
#include <cstring>
using namespace std;
int main(){
long long n,m,sum;
int x,a[650],w;
memset(a,0,sizeof(a));
cin>>n>>w;
for(int i=1;i<=n;i++){
cin>>x;
a[x]++;
sum=0;
for(int j=600;j>=0;j--){
sum=sum+a[j];
if(sum>=max(1,i*w/100)){
cout<<j<<" ";
break;
}
}
}
return 0;
}