Codeforces Global Round 8 A-D

A:显然 交替加 增大最快

#include 
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
 
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	int t;
	cin>>t;
	while(t--)
	{
		ll a,b,n;
		cin>>a>>b>>n;
		int z=0;
		while(1)
		{
			if(max(a,b)>n)break;
			if(a>b)swap(a,b);
			a+=b;
			z++;
		}
		cout<

B:指数级增大肯定是最快的。

#include 
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
ll qpow(ll a,ll b)
{
	ll ans=1;
	while(b)
	{
		if(b&1)ans=ans*a;
		a=a*a;
		b/=2;
	}
	return ans;
}
char s[11]={"codeforces"};
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	ll k;
  	cin>>k;
  	int id=0;
  	for(int i=1;i<=100;i++)
  	{
  		if(qpow(i,10)>k)
  		{
  			id=i-1;
  			break;
		  }
	}
	int z=0;
	ll ans=qpow(id,10);
	for(int i=1;i<=10;i++)
	{
		if(ans>=k)break;
		ans=ans/id*(id+1);
		z++;
	}
	for(int i=1;i<=10;i++)
	{
		int tp=id;
		if(i<=z)tp++;
		for(int j=1;j<=tp;j++)cout<

C:2*2的方格刚好满足每个格子周围两个黑色。 两个2*2边角相连刚好可以造出一个四周全是黑色的情况

#include 
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
void pr(int i)
{
	printf("%d %d\n",1+i,i);printf("%d %d\n",2+i,i);
  	printf("%d %d\n",0+i,i+1);printf("%d %d\n",2+i,i+1);
  	printf("%d %d\n",0+i,i+2);printf("%d %d\n",1+i,i+2);printf("%d %d\n",2+i,i+2);
}
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	int n;
  	cin>>n;
  	printf("%d\n",7*n+8);
  	printf("%d %d\n",0,0);printf("%d %d\n",1,0);printf("%d %d\n",2,0);
  	printf("%d %d\n",0,1);printf("%d %d\n",2,1);
  	printf("%d %d\n",0,2);printf("%d %d\n",1,2);printf("%d %d\n",2,2);
  	for(int i=1;i<=n;i++)pr(i*2);
	return 0;
}

D:a|b, a&b  的结果只是让a,b的某个数的某几位的1移到另一个数。

最后统一分配1即可。尽量让数凑得大。

#include 
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
int nm[M];
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	int n,sm=0;
  	cin>>n;
  	for(int i=1;i<=n;i++)
  	{
  		int x;
  		cin>>x;
  		for(int j=0;j<20;j++)
  		{
  			if((x>>j)&1)
  			nm[j]++;
  			sm++;
		}
	}
	ll ans=0;
	for(int i=1;i<=n;i++)
	{
		ll tp=0;
		for(int j=19;j>=0;j--)
		{
			if(nm[j]&&sm>n-i)
			{
				tp+=(1<

 

你可能感兴趣的:(CF)