BNUOJ新生赛题解

首先给个链接给大家,让大家慢慢看题http://acm.bnu.edu.cn/v3/problem.php#page=1726

题目1:无聊的游戏

比赛的时候不敢对数学题下手是个巨大的问题。题目很明显给那么大的n,k(最大10^9)。除了数学规律没有其他方法。首先就是对n分类,分奇偶。多算几个就边弄边猜

下面讨论:n为奇数时,当k%4=1或者2时,B获胜,否则A获胜

n为偶数时,当k为奇数,为平局输出F;当k%4=2时,输出B,否则输出A

其实吧,这种题在比赛的时候,派个队友数学好的,把n,k=1,2,3,4,5,6的各种情况列举一下,细心点,总结规律。很好做的

不多说,代码如下:

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
		if (n%2)
		{
			if (k%4==1||k%4==2) puts("B");
			else puts("A");
		}
		else
		{
			if (k%2==1) puts("F");
			else if (k%4==2) puts("B");
			else puts("A");
		}
	}
	return 0;
}

题目2:萌萌哒BY哥哥

这个没啥好说的,大家去翻组合数学的书吧,错排公式:Xn=(n-1)(X(n-1)-X(n-2))。唯一的坑点是不能用int要用long long

题目3:Monty Hall Problem

数学好的队友做的,思路如下:

原来一共n扇门,其中有n-1扇门后面是山羊,只有1扇门后面是汽车。因此,初始情况选择山羊的概率是(n-1)/n,汽车的概率是1/n

第一次选择之后,已经揭晓了n-2个山羊,由题意知,必须改选门,则:初始选择山羊的话,就改成了选择汽车,因此答案就是(n-1)/n

题目4:计算题

坑点1:可以为空,即长度为0时输出0。因此必须用gets读入

坑点2:每次累加时要给ans%p,不然可能越界

题目5:冠名争夺战

很好的博弈题:答案出人意料的简单:永远都是Bill will lose HAHA

解释:反证法:(注意到决策次数不是把所有的石子都选择完,而是只选择几个)(证明思想非常类似于取石子的博弈)

假设后手有必胜策略,即取到Ai颗石子使得在剩余的所有石子中,先手找不到一个石子可以打败Ai。那么在先手的第一次任意选择时,先手就可以选择Ai颗石子使自己获胜。因此,无论游戏怎样设计,必然都是先手获胜

题目6:柯南的精灵

数学题:至今没找到规律,希望有大神能够教教我

题目7:疯狂睡眠

标准贪心:以各睡眠时间的结束点由低到高进行排序,若相同,则按照起始点的由低到高排序

排序后,依次按顺序逐渐选择即可。代码如下

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <cstring>
#include <sstream>
#include <queue>
#include <stack>
using namespace std;

#define input freopen("input.txt","r",stdin)
#define output freopen("output.txt","w",stdout)
#define For1(i,a,b) for (i=a;i<b;i++)
#define For2(i,a,b) for (i=a;i<=b;i++)
#define Dec(i,a,b) for (i=a;i>b;i--)
#define Dec2(i,a,b) for (i=a;i>=b;i--)
#define Sca_d(x) scanf("%d",&x)
#define Sca_s(x) scanf("%s",x)
#define Sca_c(x) scanf("%c",&x)
#define Sca_f(x) scanf("%f",&x)
#define Sca_lf(x) scanf("%lf",&x)
#define Sca_lu(x) scanf("%I64d",&u)
#define Sca_ld(x) scanf("%I64d",&x)
#define Fill(x,a) memset(x,a,sizeof(x))
#define inf 0x3f3f3f3f

struct node
{
	int x,y;
}que[10005];

int cmp(const void *a,const void *b)
{
	struct node *c=(node *)a;
	struct node *d=(node *)b;
	if (c->x!=d->x) return c->y - d->y;
	return c->x - d->x;
}

int main()
{
	//input;
	int t,n,i,j,k,ans,cur;
	cin>>t;
	while(t--)
	{
		Fill(que,0);
		cin>>n;
		For2(i,1,n)
			Sca_d(que[i].x),Sca_d(que[i].y);
		qsort(que+1,n,sizeof(que[0]),cmp);
		cur=i=ans=0;
		while(i<n)
		{
			i++;
			if (cur<que[i].x)
			{
				cur=que[i].y;
				ans++;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

题目8:First Contact

简单0-1背包模型:却浪费了1个小时,还需对经典问题多加总结与训练

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <cstring>
#include <sstream>
#include <queue>
#include <stack>
using namespace std;

#define input freopen("input.txt","r",stdin)
#define output freopen("output.txt","w",stdout)
#define For1(i,a,b) for (i=a;i<b;i++)
#define For2(i,a,b) for (i=a;i<=b;i++)
#define Dec(i,a,b) for (i=a;i>b;i--)
#define Dec2(i,a,b) for (i=a;i>=b;i--)
#define Sca_d(x) scanf("%d",&x)
#define Sca_s(x) scanf("%s",x)
#define Sca_c(x) scanf("%c",&x)
#define Sca_f(x) scanf("%f",&x)
#define Sca_lf(x) scanf("%lf",&x)
#define Sca_lu(x) scanf("%I64d",&u)
#define Sca_ld(x) scanf("%I64d",&x)
#define Fill(x,a) memset(x,a,sizeof(x))
#define inf 0x3f3f3f3f

int dp[1005];
int book[1005];
int aa[1005];
int bb[1005];

int main()
{
	//input;
	int a,b,n,x,y,i,j,t;
	cin>>t;
	for(int Case=1;Case<=t;Case++)
	{
		Fill(dp,0);Fill(aa,0);Fill(bb,0);Fill(book,0);
		cin>>a>>b>>n;
		For2(i,1,n) cin>>aa[i];
		For2(i,1,n) cin>>bb[i];
		/*For2(i,1,n)
			For2(j,1,i)
				if (aa[i]>aa[j]||(aa[i]==aa[j]&&bb[i]<bb[j]))
				{
					int temp;
					temp=aa[i];aa[i]=aa[j];aa[j]=temp;
					temp=bb[i];bb[i]=bb[j];bb[j]=temp;
				}
		*/
		for(i=1;i<=n;i++)
			for(j=a;j>=aa[i];j--)
				dp[j]=max(dp[j],dp[j-aa[i]]+bb[i]);
		printf("Case #%d: %s\n",Case,dp[a]>=b?"YES":"NO");
		//printf("%d\n",dp[a]);
	}
	return 0;
}

题目9:平面切割者

本来比赛的时候可以自豪一番,第一次就把公式推理出来了,坑爹的n=0!

首先可以画图计算:n=0时ans=2,n=1时ans=4,n=2时ans=8,n=3时ans=13,n=4时ans=19(这个画图比较费劲。。圆要画得很大)

接下来是推理:把大圆和小圆中间的圆环看作一个部分,每次增加一根线,多增加两个区域

把小圆看作另外一个部分,每次增加一根线,多增加i个区域,其中i是当前添加的是第i根线

因此,在O(n)时间推得,ans[i]=ans[i-1]+i+2。初始值ans[0]=0,ans[1]=4,递推式从i=1开始计算

题目10:拯救辣条

这么小的数据,简单粗暴的DFS即可!注意:题中求与Bi不同的组数,因此输出ans-1

代码如下:

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <cstring>
#include <sstream>
#include <queue>
#include <stack>
using namespace std;

#define input freopen("input.txt","r",stdin)
#define output freopen("output.txt","w",stdout)
#define For1(i,a,b) for (i=a;i<b;i++)
#define For2(i,a,b) for (i=a;i<=b;i++)
#define Dec(i,a,b) for (i=a;i>b;i--)
#define Dec2(i,a,b) for (i=a;i>=b;i--)
#define Sca_d(x) scanf("%d",&x)
#define Sca_s(x) scanf("%s",x)
#define Sca_c(x) scanf("%c",&x)
#define Sca_f(x) scanf("%f",&x)
#define Sca_lf(x) scanf("%lf",&x)
#define Sca_lu(x) scanf("%I64d",&u)
#define Sca_ld(x) scanf("%I64d",&x)
#define Fill(x,a) memset(x,a,sizeof(x))
#define inf 0x3f3f3f3f

const int maxn=10;
int ans;
int t,n,a[maxn],b[maxn],c[maxn];

void dfs(int cur)
{
	int i,j,k;
	if (cur==n+1)
	{
		ans++;
		//For2(j,1,n)
		//	printf("%d%c",c[j],j==n?'\n':' ');
		return;
	}
	For2(i,0,a[cur])
	{
		c[cur]=i;
		if (cur==1) dfs(cur+1);
		else if ((b[cur]>b[cur-1]&&c[cur]>c[cur-1])||(b[cur]==b[cur-1]&&c[cur]==c[cur-1])||(b[cur]<b[cur-1]&&c[cur]<c[cur-1]))
			dfs(cur+1);
	}
	return;
}

int main()
{
	//input;
	int i,j,k;
	cin>>t;
	while(t--)
	{
		cin>>n;
		For2(i,1,n) cin>>a[i];
		For2(i,1,n) cin>>b[i];
		ans=0;
		dfs(1);
		cout<<ans-1<<endl;
	}
	return 0;
}

题目11:顽皮的字母

字母顽皮的我都想打人了。但学到了一个很好的像是DP的思想,我当前的判断值只跟前面已经做过的判断比较

代码如下:

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <cstring>
#include <sstream>
#include <queue>
#include <stack>
using namespace std;

#define input freopen("input.txt","r",stdin)
#define output freopen("output.txt","w",stdout)
#define For1(i,a,b) for (i=a;i<b;i++)
#define For2(i,a,b) for (i=a;i<=b;i++)
#define Dec(i,a,b) for (i=a;i>b;i--)
#define Dec2(i,a,b) for (i=a;i>=b;i--)
#define Sca_d(x) scanf("%d",&x)
#define Sca_s(x) scanf("%s",x)
#define Sca_c(x) scanf("%c",&x)
#define Sca_f(x) scanf("%f",&x)
#define Sca_lf(x) scanf("%lf",&x)
#define Sca_lu(x) scanf("%I64d",&u)
#define Sca_ld(x) scanf("%I64d",&x)
#define Fill(x,a) memset(x,a,sizeof(x))
#define inf 0x3f3f3f3f

char s[1000000],ans[1000000];
int main()
{
	//input;
	int i,j,k,l,t,flag,start,cur;
	cin>>t;
	while(t--)
	{
		 cin>>s;
		 l=strlen(s);
		 cur=1;
		 ans[0]=s[0];
		 for(i=1;i<l;i++)
		 {
		 	if (s[i]%2)//当前字母为 a,c,e,g……
		 	{
		 		if (s[i]+1==ans[cur-1]) cur--;//满足ab,cd……把ans的已存的字母删除
		 		else ans[cur++]=s[i];//添加当前字母
		 	}
		 	else//当前字母为b,d,f,h……
		 	{
		 		if (s[i]-1==ans[cur-1]) cur--;
		 		else ans[cur++]=s[i];
		 	}
		 }
		 ans[cur]='\0';
		 if (!cur) puts("sad!");//所有的字母已经消除
		 else printf("%s\n",ans);
	}
	return 0;
}
时间: 2024-11-05 15:35:34

BNUOJ新生赛题解的相关文章

ZAFU 新生赛题解

一篇迟到的题解,本以为大家兴趣不大,但是有同学问了,本人觉得还是应该写一下. T酱和他的数学题 要求判断末尾有多少个0 我们分析一下就可以知道0只能是来自2 和 5 的乘积. 对于每一个数字我们只需要去判断可以分解出多少个2和5就可以,其中5的出现次数一定会小于2的出现次数. 由于是阶乘的阶乘 所以我们只需要暴力一遍,维护5出现次数的前缀和的前缀和就可以了 1 #include <stdio.h> 2 int cal(int x) 3 { 4     int res = 0; 5     wh

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解 华南师范大学第很多届 ACM 程序设计竞赛新生赛(初赛)在 2017 年 11 月 20 日 - 27 日成功举行,共有 146 名同学有效参赛(做出 1 题).进入决赛的资格初定为完成并通过 5 题或以上,决赛时间是 12 月 3 日,地点未定. 题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也

ZSC新生赛 沼跃鱼早已看穿了一切

Description 沼跃鱼打开密码门后发现门后是一个像迷宫一样的房间,墙上的指示牌写着:房间内某处有一宝箱,但是宝箱被上锁了,钥匙在这个房间的某个角落.沼泽鱼对宝箱里有什么很感兴趣,但它必须先去拿到钥匙才可以打开宝箱.然而沼跃鱼早已看穿了一切,它看清了这个房间的布局,现在给出房间的布局图,问沼跃鱼拿到钥匙并打开宝箱最少需要走多少步.沼跃鱼每次只能向上.下.左.右中其中一个方向走一步,但若那个位置是墙时则不能往那个位置走(显然,沼跃鱼不能穿墙). Input 输入的第一行是一个整数T(0<T<

SCNU 2015ACM新生赛决赛【F. Oyk闯机关】解题报告

题目大意:一个$N$$\times$$N$的阵列,每个格子有$X_{ij}$个调和之音,若每次只能选择走右边或下边,从左上角出发走到右下角,问最多能收集到多少个调和之音? 这题是一道很很很简单的DP题,但可能之前没接触过的同学需要一点脑能量去思考..如果用最蠢的办法,循环枚举每种选择,求出最大值的话,由于你总共需要往右走$N-1$次,往下走$N-1$次,路径总长度为$2N-2$,根据组合数学,总共有$C_{2N-2}^{N-1}$种走法,想想$C_{1998}^{999}$会是一个多么可怕的数字

(最短路)17bupt新生赛——F. ch追妹

F. ch追妹 2017新生赛 时间限制 2000 ms 内存限制 65536 KB 题目描述 n个点的一张无向图,每条边长度为wi,ch站在a点,ch要追的妹子站在b点.ch可以使用一次膜法,将一条边的长度变为0.ch想知道他要追到妹子要走的最短路径. 输入格式 第一行为数据组数T(T≤10).每组数据的第一行为四个数 n,m,a,b(1≤a,b≤n≤10000,1≤m≤50000),分别表示点数,边数,ch的位置,妹子的位置.之后m行,每行为三个数 u,v,w(1≤u,v≤n;1≤w≤100

哈理工新生赛热身赛解题报告

本次热身赛6道题目,由于没有官方解题报告,自己写了一个山寨版的解题报告,希望对学弟学妹有所帮助 期中两到签到题该校OJ上没有挂出,我在田大神的帮助下a掉了其它四题,解题报告如下所示 线段 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 10(6 users) Total Accepted: 7(6 users) Rating:  Special Judge: No Description 坐标轴上有一些点,依次给出.点与点之间要求用

记TJPUのACM新生赛——Stay young, stay simple

刚看完国家德比来写点什么吧...话说比赛挺无聊,光头也真是命硬. 2016-12-3,12:00-17:00,TJPUのACM新生赛如期举行. 总体来说这次比赛体验还是比我第一次进行5小时比赛的浙江理工大学新生邀请赛要舒服的多(那次浙理工OJ直接爆了...) 然后凭着运气好和各位大佬的不杀之恩混到了第一... 比赛情况大概是上面图片那样,其实写出的题都挺水的,后面的DFS.BFS以及贪心什么的我都没多想...反正不会写. 唯一值得记录的大概是D题,HDOJ上有(5979),是2016ACM/IC

(dp)17bupt新生赛——B. Hmz 的女装

B. Hmz 的女装 2017新生赛 时间限制 1000 ms 内存限制 65536 KB 题目描述 Hmz为了女装,想给自己做一个长度为n的花环.现在有k种花可以选取,且花环上相邻花的种类不能相同.Hmz想知道,如果他要求第l朵花和第r朵花颜色相同,做花环的方案数是多少.这个答案可能会很大,你只要输出答案对109+7取模的结果即可. 输入格式 第一行三个整数n,m,k(1≤n≤100000,1≤m≤100000,1≤k≤100000)接下来m行,每行两个整数l,r,表示要求第l朵花和第r朵花颜

ZSC新生赛 聪明的员工

聪明的员工 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 481  Solved: 219[Submit][Status][Web Board] Description 小新是一家公司的员工,每个员工都有一个编号.每天上班时,老板都让员工排成一个队伍.但是,每次老板都对队伍的顺序不满意,于是老板重新编排新的队伍顺序,然后让员工按顺序排好.老板有特别要求,队伍每次只能将其中一个人移动到队头.聪明的小新很快想到最少移动次数使得队伍的顺序跟老板指定的顺序