AtCoder Beginner Contest 100 题解
A
抽屉原理
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b; cin>>a>>b;
if(a<=8 && b<=8) puts("Yay!");
else puts(":(");
return 0;
}
B
特判 n==100
情况
#include<bits/stdc++.h>
using namespace std;
int pow_(int x,int p){
int res=1;
while(p--) res=res*x;
return res;
}
int main(){
int d,n; cin>>d>>n;
if(n==100) n++;
cout<<n*pow_(100,d)<<endl;
return 0;
}
C
#include<bits/stdc++.h>
using namespace std;
int main(){
int n; cin>>n;
int cnt=0;
while(n--){
int k; cin>>k;
while(!(k&1)) k>>=1, cnt++;
}
cout<<cnt<<endl;
return 0;
}
D
枚举统计贡献时候三个属性( \(u,v,w\) )贡献的和是正还是负,然后对 \(2^3\) 种情况求个最大值。
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
typedef long long ll;
const int N=1005;
struct node{
ll u,v,w;
}a[N], b[N];
int f[4];
bool cmp(node x,node y){
ll kx=x.u+x.v+x.w, ky=y.u+y.v+y.w;
return kx>ky;
}
int main(){
int n,m;
cin>>n>>m;
rep(i,1,n){
ll u,v,w; cin>>u>>v>>w;
a[i]={u,v,w};
}
ll res=0;
rep(i,0,(1<<3)-1){
rep(j,0,2) f[j]=(i>>j&1)?1:-1;
rep(p,1,n) b[p]={f[0]*a[p].u, f[1]*a[p].v, f[2]*a[p].w};
sort(b+1,b+1+n,cmp);
ll rec=0;
rep(i,1,m) rec+=b[i].u+b[i].v+b[i].w;
res=max(res,rec);
}
cout<<res<<endl;
return 0;
}