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