Codeforces Round #162 (Div. 2)总结

17 篇文章 0 订阅

昨天没时间做,今天早上补做的。

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值