【牛客】小白月赛29复盘(自我学习用)
A-进攻
https://ac.nowcoder.com/acm/contest/8564/A
初看会以为是完全背包问题。但是如果遇到贪心和DP无法判断的时候怎么知道用哪个。。其实我也不太懂。好像可以数学证明,但是我还不会,埋个坑,接下来会学的。
其实是一个贪心问题,这个AC代码的思想很巧妙,具体的话先看代码
#include <bits/stdc++.h>
using namespace std;
struct basement{//这是基地的属性
int d,v;
}base[1000010];
bool cmp(basement x,basement y){//按照防御值为主要关键字、价值为次要关键字进行升序排序
if(x.d!=y.d)return x.d<y.d;
else return x.v<y.v;
}
int a[1000010];
int main(){
int n,m; cin>>n>>m;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<m;i++)cin>>base[i].d;
for(int i=0;i<m;i++)cin>>base[i].v;
sort(a,a+n);
sort(base,base+m,cmp);
int p=0,ans=0;//p储存base的下标,由于基地和战斗机的都是升序排列的,所以p可以不用每次更新,大大减小了复杂度
int ma=0;
for(int i=0;i<n;i++){//这里是精华
while(p<m&&a[i]>base[p].d){
ma=max(ma,base[p].v);
p++;
}
ans+=ma;
}
cout<<ans;
return 0;
}
为啥说这个是精华,假设我们现在要攻打基地了,我们先派出战斗力最少的战斗机,然后从最低的防御值开始找,找到自己不能打为止,而从中我们利用ma来储存
到不能打为止的最大值。为什么ma不用更新呢?因为我们已经把a数组给升序排了,之前能打的后面一定能打,而每个基地也是无限个的,所以p也不用更新。
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
B-二进制
https://ac.nowcoder.com/acm/contest/8564/B
这是一道位运算的题目。。我位运算老菜了。
AC代码的处理非常巧妙,利用了位运算的几种规律,如下
设输入的数字的第i位是数字x(x为0或者1)
x&1=x; x&0=0;
x|1=1; x|0=0;
x^1=!x; x^0=x;
所以,不是所有的操作都会改变x的值,只需要注意到那些能影响到x的值就行
那么如何实现呢,我们需要拿两个实验品,也就是0和1e20-1
两个边界值,一个全是0,一个全是1,最后结果拿来遍历,利用上面找到的规律寻找等价解即可
#include <bits/stdc++.h>
using namespace std;
int main(){
int n; cin>>n;
int op,a;
int ret1=0,ret2=(1<<20)-1;//两个实验品
while(n--){
cin>>op>>a;
if(op==1){
ret1&=a; ret2&=a;
}else if(op==2){
ret1|=a; ret2|=a;
}else{
ret1^=a; ret2^=a;
}
}
//此时通过实验得到的东西可以拿来推等价过程了
int Xor=0,And=0,Or=0;//最后结果,初始化为0
for(int i=0;i<20;i++){
if(!(ret1&(1<<i))&&(ret2&(1<<i)))And|=(1<<i);//如果(0&&1)那么就是和原来一样,说明该位是1
else if((ret1&(1<<i))&&(ret2&(1<<i)))Or|=(1<<i);//如果(1&&1)那么就说明全是1,说明该位是1
else if((ret1&(1<<i))&&!(ret2&(1<<i)))Xor|=(1<<i),And|=(1<<i);//如果(1&&0)说明刚好倒位,该位是1,并且可能先通过&的方法再去^
//为什么不补Or呢,假如该位是1,那么就会让ret1和ret2都变成1,不合情况了,而且之前全部都补1是因为补1方便
}
puts("3");
cout<<"1 "<<And<<endl;
cout<<"2 "<<Or<<endl;
cout<<"3 "<<Xor<<endl;
return 0;
}
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————