五道题只写出了现场只写出两道题,orz
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5640
题意:阅兵式前一天,是国王的生日,大臣们为他准备了一个 n×m(1≤n,m≤10000) 的蛋糕。他准备切蛋糕,但他切蛋糕有奇奇怪怪的癖好,他每次只切一刀,且必须切下一个正方形蛋糕。请问它最多能切出多少个正方形蛋糕?
题解:很水的题,不断的交替模和除就可以。
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int T,n,m,ans;
int main()
{
scanf("%d",&T);
while(T--)
{
ans=0;
scanf("%d%d",&n,&m);
if (n>m)
swap(n,m);
while(n)
{
ans+=m/n;
m=m%n;
if (n>m)
swap(n,m);
}
printf("%d\n",ans);
}
}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5641
题意:阅兵式上,国王见到了很多新奇东西,包括一台安卓手机。他很快对手机的图形解锁产生了兴趣。
解锁界面是一个 3×3 的正方形点阵,第一行的三个点标号 1,2,3,第二行的三个点标号 4,5,6,第三行的三个点标号 7,8,9。密码本身是一段序列,表示经过点的先后顺序,但遵循如下规则:
密码至少经过四个点。
不能重复经过同一个点。
路径上的中间点不能跳过,除非已经被经过(3427 是合法的,但 3724不合法)。
他想设置的密码的长度为正整数 k(1≤k≤9),密码序列为 s1s2…sk(0≤si< INT_MAX),他想知道这个密码序列是否合法,这个问题交给了你。
题解:超级大模拟,注意各种细节和数据的坑人之处,比赛时被坑wa了四次。
题意:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int T,k,a[15],flag;
int vis[10];
int x[10][10];
int main()
{
scanf("%d",&T);
while(T--)
{
flag=0;
scanf("%d",&k);
x[1][3]=2;x[3][1]=2;
x[4][6]=5;x[6][4]=5;
x[7][9]=8;x[9][7]=8;
x[1][7]=4;x[7][1]=4;
x[1][9]=5;x[9][1]=5;
x[3][7]=5;x[7][3]=5;
x[3][9]=6;x[9][3]=6;
x[2][8]=5;x[8][2]=5;
memset(vis,0,sizeof(vis));
for (int i=1;i<=k;i++)
{
scanf("%d",&a[i]);
if (a[i]<=0 || a[i]>9) flag=1;
}
if (k>9 || k<4)
{
printf("invalid\n");
continue;
}
if (flag==1)
{
printf("invalid\n");
continue;
}
vis[a[1]]=1;
vis[0]=1;
for (int i=2;i<=k;i++)
if (vis[x[a[i]][a[i-1]]]==1&&vis[a[i]]==0)
vis[a[i]]=1;
else flag=1;
if (flag) printf("invalid\n");
else printf("valid\n");
}
}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5642
题意:国王演讲后士气大增,但此时战争还没有结束,国王时不时要下发命令。
由于国王的口吃并没有治愈,所以传令中可能出现:“让第三军-军-军,到前线去” 这样的命令。由于大洋国在军队中安插了间谍 , 战事紧急,很多时候前线的指挥官不能分清哪些命令真正来自国王。但国王的命令有一个特点,他每次连续重复的字符最多 3 次. 所以说他的命令中没有:“让第三军-军-军-军 , 到前线去”,但是可以有 :“让第三军-军 , 到前线去” 。
此时将军找到了你,你需要告诉他,给定命令的长度长度为 n,有多少种不同的命令可以是国王发出的 。(也就是求长度为 n 的合格字符串的个数)当然,国王可能说出一句话没有犯任何口吃,就像他那次演讲一样。
为了简化答案,国王的命令中只含有小写英文字母,且对答案输出模 1000000007。
我们认为两个命令如果完全相同那么这两个字符串逐个比较就完全相同。
题解:题目扯这么多,其实是问存在多少长度为n的字符串符合字符串中最多只有三个连续相同的字符,当时看到题以为是推出一个数学公式,结果推出来之后发现错了。。还是dp比较靠谱。
二维dp,dp[ i ][ j ] 表示长度为 i 的符合条件字符串 且 后j位为相同字母的字符串的个数。
题解:
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#define mmod (1000000007)
using namespace std;
int T,n,m;
long long dp[2005][4];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(dp,0,sizeof(dp));
dp[1][1]=26;
for (int i=2;i<=n;i++)
for (int j=1;j<=3;j++)
{
dp[i][j]=dp[i-1][j-1];
dp[i][1]+=dp[i-1][j]*25;
dp[i][1]%=mmod;
}
long long ans=(dp[n][1]+dp[n][2]+dp[n][3])%mmod;
// printf("%I64d\n",ans);
cout<<ans<<endl;
}
}
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5643
题意:为了铭记历史,国王准备在阅兵的间隙玩约瑟夫游戏。它召来了 n(1≤n≤5000)n(1\le n\le 5000)n(1≤n≤5000) 个士兵,逆时针围成一个圈,依次标号 1,2,3…n1, 2, 3 … n1,2,3…n。
第一轮第一个人从 1 开始报数,报到 1 就停止且报到 1的这个人出局。
第二轮从上一轮出局的人的下一个人开始从 1 报数,报到 2 就停止且报到 2的这个人出局。
第三轮从上一轮出局的人的下一个人开始从 1 报数,报到 3 就停止且报到 3的这个人出局。
第 n−1 轮从上一轮出局的人的下一个人开始从 1 报数,报到 n−1 就停止且报到 n−1 的这个人出局。
最后剩余的人是幸存者,请问这个人的标号是多少?
其实还有一道费用流的题,但还没正式学图论,所以就不写了,还是太菜