纪中集训 Day33&Day34

这篇博客记录了作者在纪中集训期间遇到的编程挑战,包括T1的奇偶性判断问题,T2的汉诺塔问题的解题思路,以及T4的香樟树问题,涉及到数论和动态规划的应用。
摘要由CSDN通过智能技术生成

纪中集训 Day33&Day34

T1
嗯哼,纯粹判断奇偶

T2
找规律啊
我真心没看出来

T3
一个T组数据
老师你玩我。。。

T4
刚打完一个类似不下降子序列的DP
OJ不让我交
明明我还有2分钟


T1

石子游戏

题目
小勇和小实是对好朋友,他们经常一起游戏。 今天他们玩的游戏是这样的:有一个由正方形石头铺成的地板,它的高是2,长度是 N N N。 例如以下是 N N N=3的情况:
在这里插入图片描述
现在他们轮流在上面放上长宽分别是1和2的矩形石块,可以横放也可以竖放,但要刚好铺在地板上两个未被覆盖的正方形石头上,当某人不能放上去时他就输了。
例如,某次游戏可能是这样的,小实横放石块在左上面,如下:
在这里插入图片描述
然后小勇横放石块在右下面,如下:
在这里插入图片描述
这时小实不能再放石块了,所以他输了。小勇比较礼让,他让小实先放。当然,以上的方法可能不是最好的,现在假如他们都绝顶聪明,请你编程判断究竟谁会赢。

输入
第一行一个整数 C C C(1<= C C C<=100),表示测试数据的个数。 接下来有 C C C行,每行为一个测试数据,每个测试数据只有一个整数 N N N(1<= N N N<=100)。

输出
输出 C C C行,每行输出相应测试数据的结果。对于每个结果,如果是小勇赢的话就输出 x i a o y o n g xiaoyong xiaoyong,否则就是小实赢啦,输出 x i a o s h i xiaoshi xiaoshi

样例
input
1
1

output
xiaoshi

解题思路
一开始想到DP
然后完整推出来后发现
不就是判断奇偶吗
奇数小实赢
偶数小勇赢

代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,l;
int main()
{
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&l);
		if (l%2!=0)
		   printf("%s\n","xiaoshi");
		   else printf("%s\n","xiaoyong"); 
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T2

汉诺塔(hanoi)

题目
古老的汉诺塔问题是这样的:用最少的步数将 N N N个半径互不相等的圆盘从1号柱利用2号柱全部移动到3号柱,在移动的过程中小盘要始终在大盘的上面。 现在再加上一个条件:不允许直接把盘从1号柱移动到3号柱,也不允许直接把盘从3号柱移动到1号柱。 把盘按半径从小到大用1到 N N N编号。每种状态用 N N N个整数表示,第 i i i个整数表示 i i i号盘所在的柱的编号。则 N N N=2时的移动方案为: (1,1)=>(2,1)=>(3,1)=>(3,2)=>(2,2)=>(1,2)=>(1,3)=>(2,3)=>(3,3) 初始状态为第0步,编程求在某步数时的状态。

输入
输入文件的第一行为整数 T T T(1<= T T T<=50000),表示输入数据的组数。 接下来 T T T行,每行有两个整数 N N N, M M M(1<= n n n<=19,0<= M M M<=移动 N N N个圆盘所需的步数)。

输出
输出文件有 T T T行。 对于每组输入数据,输出 N N N个整数表示移动 N N N个盘在 M M M步时的状态,每两个数之间用一个空格隔开,行首和行末不要有多余的空格。

样例
input
4
2 0
2 5
3 0
3 1

output
1 1
1 2
1 1 1
2 1 1

解题思路
在这里插入图片描述自己发掘规律哈

代码

#include<iostream>
#include<cstdio>
using namespace std;
int t,n,m,a[6]={1,2,3,3,2,1};
int main()
{
	freopen("hanoi.in","r",stdin);
	freopen("hanoi.out","w",stdout);
	scanf("%d",&t);
	for (int i=1;i<=t;i++)
	{
		scanf("%d%d",&n,&m);
		for (int j=1;j<=n;j++)
		{
			printf("%d ",a[m%6]);
			m=m/3; 
		}
		printf("\n");
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T4

香樟树(camphor)

题目
被誉为江南四大名木之一的香樟树很有特色,它的树皮粗糙,质地却很均匀,从来没有白杨树的斑斑驳驳、没有柳树的肿瘤结节;树枝树干一分为二、二分为四一路长去,不会偷工减料也不会画蛇添足;树冠的形态是球形的,在天空中画出优美的曲线。 除了上述优点之外,香樟树还有一个秘密武器。那就是……………………它凭借朴实、厚重的优秀品格赢得了小狐狸的青睐!!! 话说有一天,小狐狸正在湖边散步,忽然一阵风吹来,她赶紧闭上眼睛。当她再次睁开眼睛时,发现美丽的湖畔多出了一排整齐的香樟树。小狐狸非常兴奋,她对每棵树都观察入微,并且数出了它们的叶子个数。她觉得如果相邻两棵树的叶子个数互素是不和谐的。因此小狐狸想从一排香樟树中选出若干棵,在满足相邻两棵树的叶子个数不互素的条件下,使得树尽量多。

输入
第一行一个正整数 n n n,表示有 n n n棵香樟树。 第二行 n n n个正整数,第 i i i个数表示第 i i i棵香樟树叶子的个数。

输出
一个正整数,表示最多能选多少棵树。

样例
input
6
6 2 3 15 8 5

output
4

数据范围限制
对于60%的数据 n n n<=1000     
对于100%的数据 n n n<=100000,叶子个数<=100000
注意:选中的树不能改变其位置,即如果选中第( t t t 1, t t t 2, t t t 3…… t n tn tn)棵树 ,其中t1< t t t 2< t t t 3<……< t n tn tn则认为 t i ti ti t i ti ti+1相邻。

提示
选择第1、第3、第4和第6棵树

解题思路
如最长不下降子序列一般
那个玄学优化我也没懂呢

代码

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,z,ma,t,a[100010],b[100010];
int zzxc(int x,int y)
{
	int r;
	while (x%y!=0)
	{
		  r=x%y;
		  x=y;
		  y=r; 
	}
	return y;
}
int log(int x)
{
	int l=0;
	while (x>0)
	{
		  x=x/2;
		  l++;
	}
	return l;
}
int main()
{
	freopen("camphor.in","r",stdin);
	freopen("camphor.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&b[i]);
		a[i]=1;
		for (int j=max(i-log(i)*2,1);j<=i-1;j++)
		{  
			if (zzxc(b[i],b[j])>1)  //与相邻的不互质
			{ 
				a[i]=max(a[j]+1,a[i]);   //更新最大值
				ma=max(ma,a[i]);  //找出当前最大值
			}
		}
	}
	cout<<ma<<endl;
	fclose(stdin);
	fclose(stdout);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值