Wannafly挑战赛24-A,B,C

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/C_13579/article/details/82760230

A-石子游戏:https://www.nowcoder.com/acm/contest/186/A

思路:对于大于1的奇数分析,对于3 可以分为1,2,然后2与其他偶数合并,总共2次;考虑最后的偶数也与其他偶数合并,那么对于5可以分成 1,4 (2次)和 3,2 (4次),7和分为 1,6(2次),3,4(4次)和 5,2(6次)可以发现大于1的奇数的操作次数都是偶数次,那么说明奇数对于结果是没有影响的,只要对偶数个数考虑,当偶数个数为偶数是为Bob赢,为奇数则为 Alice赢,对于特殊情况,只有一个奇数时同样成立,而全为 1时则是 Bob赢

Code :

#include<iostream>
using namespace std;

int main()
{
	int n,s2=0,x,p=0;
	cin>>n;
	for(int i=0;i<n;++i)
	{
		cin>>x;
		if(x%2==0)	++s2;
		if(x>1)	p=1;
	}
	string str="Alice";
	if(!p||s2%2)	str="Bob";
	cout<<str<<endl;
	
	return 0;
}

B-222333 :https://www.nowcoder.com/acm/contest/186/B

思路:dalao博客:http://www.cnblogs.com/skylee03/p/9649849.html

Code :

#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;

const int MAX_S=10000005;
int p;
int d[MAX_S];

int main()
{
	int a,b;
	while(cin>>p){
		memset(d,0,sizeof(d));
		int s=3;
		for(int i=1;i<=p;s=s*3%p,++i)
			if(!d[s])	d[s]=i;
			else	break;
		LL n=p-2,inv=1,ai=2;
		while(n){
			if(n&1)	inv=inv*ai%p;
			ai=ai*ai%p;
			n>>=1;
		}
		s=inv;
		int sum=p+1;
		for(int i=1;i<=p&&i<sum;s=s*inv%p,++i)
			if(d[s]&&sum>i+d[s]){
				a=i;	b=d[s];
				sum=a+b;
			}
		cout<<a<<" "<<b<<endl;
	}
	
	return 0;
}

C-失衡天平 :https://www.nowcoder.com/acm/contest/186/C

思路:唉,好菜啊我,dalao博客:http://www.cnblogs.com/ccut-ry/p/9649813.html

易知在放置时操作多次其实和操作一次最终的效果是一样的
dp[i][j] : 在第 i 个物品天平两边相差为 j 的最大收益,
dp[i][j] = max(dp[i][j], dp[i-1][j]);     //不选的情况
dp[i][j+x] = max(dp[i][j+x], dp[i-1][j]+x);  //同侧
dp[i][abs(j-x)] = max(dp[i][abs(j-x)], dp[i-1][j]+x);  //异侧

Code :

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

const int MAX_N=105;
const int MAX_S=100005;
int n,m;
int dp[MAX_N][MAX_S];

int main()
{
	memset(dp, -1, sizeof(dp));
	dp[0][0]=0;
	scanf("%d%d",&n,&m);
	for(int i=1,x;i<=n;++i)
	{
		scanf("%d",&x);
		for(int j=0;j<MAX_S;++j)
		{
			dp[i][j]=max(dp[i][j],dp[i-1][j]);
			if(j+x<MAX_S&&dp[i-1][j]!=-1){
				dp[i][j+x]=max(dp[i][j+x],dp[i-1][j]+x);
			}
			if(dp[i-1][j]!=-1)
				dp[i][abs(j-x)]=max(dp[i][abs(j-x)],dp[i-1][j]+x);
		}
	}
	int ans=0;
	for(int i=0;i<=m;++i)
		ans=max(ans,dp[n][i]);
	printf("%d",ans);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/C_13579/article/details/82760230
今日推荐