hdu6676 度度熊与运算式1 2019百度之星初赛第二场

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6676

hdu6676 度度熊与运算式1 2019百度之星初赛第二场_第1张图片

Source

2019 年百度之星·程序设计大赛 - 初赛二

官方题解

hdu6676 度度熊与运算式1 2019百度之星初赛第二场_第2张图片

照着题解写的代码

#include
#include
#include
#include
using namespace std;
const int N=1<<21;
char s[N+10];
int num[N+10];
int main()
{
	int t, cnt, tot, ans;
	scanf("%d",&t);
	while(t--){
		scanf("%s",s);
		int len=strlen(s);
		cnt=1; tot=ans=0;
		for(int i=0;i>=1;
		}
		l--;
		ans=1<=(1<

 

自己比赛的时候写的代码,比上面的还快一点

#include
#include
#include
#include
using namespace std;
const int N=1<<21;
char s[N+10];
int num[N+10];
int lowbit(int x){
	return x&(-x);
}
int main()
{
	int t, cnt, tot, ans, tmp, lb, flag, no;
	scanf("%d",&t);
	while(t--){
		tot=0, flag=0, no=0;
		scanf("%s",s);
		int len=strlen(s);
		cnt=1;
		for(int i=0;i=0;--i){
			if(flag){
				tmp=num[i]&1;
				ans^=tmp;
				continue;
			}
			tmp=ans+1;
			if((tmp&ans)==0){
				flag=1;
				i++;
				continue;
			}
			tmp=ans+2;
			if((tmp&ans)==0){
				flag=1;
				i++;
				continue;
			}
			tmp=ans;
			int now=1, lb;
			while(tmp){
				if((tmp&1)==0) lb=now;	
				now<<=1;
				tmp>>=1;
				if(((tmp+1)&tmp)==0) break;
			}
			if(num[i]>=lb){
				ans+=lb;
				num[i]-=lb;
				if(num[i]>=lb){
					int ta=num[i]&1, tb=ans&1;
					int l=1;
					while(ans){
						ans>>=1;
						l<<=1;
					}
					ans=l-1;
					ans=ans^(ta^tb^1);
					flag=1;
				}else{
					sort(num,num+i+1);
					i++;
				}
			}else{
				ans+=lb;
				no+=lb;
				i++;
			}
		}
		printf("%d\n",ans-no);
	}
	return 0;
}

 

你可能感兴趣的:(ACM)