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;
}
posted @ 2021-03-29 20:05  HinanawiTenshi  阅读(75)  评论(0编辑  收藏  举报