昨天没时间做,今天早上补做的。
A题:
题意是说给你一个字符串序列,同时给你一个命令序列。如果字符串序列的字符与命令序列的字符相等,则向前走一步。如果不等则不动。求最后你所处的位置,题目比较简单,代码:
#include<cstdio>
#include<cstring>
int main()
{
char stra[100],strb[100];
while(scanf("%s%s",stra,strb)!=EOF)
{
int pos=0;
for(int i=0;i<strlen(strb);i++)
{
if(strb[i]==stra[pos])
pos++;
}
printf("%d\n",pos+1);
}
return 0;
}
B题:
题意为有n棵树,每棵树有它自己的高度hi,在树的顶部有一个物体。而现在Liss在第一棵树,要求最少用对少时间能够把所有树顶的东西吃完。
题目所给每一秒能做的事情如下:
1、向上或向下爬一个单位。
2、吃掉当前树顶的东西。
3、横向跳到下一个树。
题目所说只能跳到下一棵树,所以只能依次吃每一颗树。我们将时间分为3部分:
第一部分为求树间跳的时间:很显然为n-1
第二部分为吃树顶东西的总时间:很显然为n
第三部分为上下移动的总时间:这个为每次树的高度与当前高度之差绝对值的和,当前当前高度在不断更新。
代码如下:
#include<cstdio>
#include<cstring>
#include<cstdlib>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int ans=n+n-1,h=0;
for(int i=0;i<n;i++)
{
int ita;
scanf("%d",&ita);
ans+=abs(h-ita);
h=ita;
}
printf("%d\n",ans);
}
return 0;
}
C题:
题意是说滚下N个已经编号的石头(从1开始到n)。每个石头后松鼠都会向左向右进行躲避,而石头滚下的位置每次都是松鼠所占的位置。为当所有石头全部滚下后,从左到右输出石头的编号。这个题进行所有向中间缩进就行了。
代码如下:
#include<cstdio>
#include<cstring>
#define MAX 1000005
char str[MAX];
int ans[MAX];
int main()
{
while(scanf("%s",str)!=EOF)
{
int n=strlen(str),l=0,r=n-1;
for(int i=0;i<n;i++)
{
if(str[i]=='l')
{
ans[r]=i+1;
r--;
}
else
{
ans[l]=i+1;
l++;
}
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
}
return 0;
}
D题:
刚开始想用每个数与前面匹配进行DP,结果一直超时。后来在网上看到用分解因数的方法做的,AC~
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 1000001
using namespace std;
int a[MAX],dp[MAX];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
if(n==1)
{
printf("1\n");
continue;
}
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
int ita=1;
for(int j=2;j*j<=a[i];j++)
if(a[i]%j==0)
{
ita=max(ita,dp[j]+1);
ita=max(ita,dp[a[i]/j]+1);
}
for(int j=1;j*j<=a[i];j++)
if(a[i]%j==0)
{
dp[j]=max(dp[j],ita);
dp[a[i]/j]=max(dp[a[i]/j],ita);
}
}
int ans=0;
for(int i=2;i<MAX;i++)
ans=max(ans,dp[i]);
printf("%d\n",ans);
}
return 0;
}