2019山东省赛C题(c++)

博客围绕坐标轴上点按规则移动的题目展开。题目给出点移动规则及输入输出要求,原解题思路先执行一次操作求最大值并扩大m倍,提交后发现问题。改进思路是先求一次操作最大值并扩大(m - 1)倍,再检验第m次操作找出最满足条件的最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题:https://vjudge.net/contest/303617?tdsourcetag=s_pcqq_aiomsg#problem/C

题目大意:
一个点(x,y)在坐标轴上按如下规则移动(默认最初点为(0,0):

  • “U”向上移动一个单位;
  • “D”向下移动一个单位;
  • “R”向右移动一个单位;
  • “L”向左移动一个单位;

输入:
第一行是整数T,有T组样例;
每组样例中,第一行是整数n、m,代表有n个操作,m次执行这n个操作,第二行是字符串,是要执行的操作;

输出:
对每组样例,在一行中输出|x|+|y|的最大值;

思路:
对一组样例来说,每次执行的n个操作都是一样的,所以要求的最大值的点也是一样的;
所以代码思路为:

  • 先进行一次n个操作,求得最大值max;
  • 将max扩大m倍即为所求;
    但在提交后是WA的,然后经过寻找样例测试,发现当在一组操作中(即一次n个操作)可能会有多个点满足 条件(即有多个点使|x|+|y|=max),所以改进代码如下:
  • 先进行一次n个操作,求得最大值max;
  • 将max扩大(m-1)倍;
  • 在对第m次操作进行检验,找出最满足条件的max,即为所求;

代码:

#include<iostream>
#include<cmath> 

using namespace std;

char str[100010];

typedef long long LL; 

int main()
{
	int t;
	cin >> t;
	while( t-- ){
		LL n, k;
		cin >> n >> k >> str;
		LL x = 0,y = 0;//出发点为(0,0) 
		LL max = 0;
		//第一步 
		for( LL i=0; i<n; i++){
			if( str[i]=='U' ){
				y++;
			}
			if( str[i]=='D' ){
				y--;
			}
			if( str[i]=='R' ){
				x++;
			}
			if( str[i]=='L' ){
				x--;
			}
			if( max<(abs(x)+abs(y)) ){
				max=(abs(x)+abs(y));
			}
		}
		//第二步 
		x=x*(k-1);
		y=y*(k-1);
		//第三步 
		for( LL i=0; i<n; i++ ){
			if( str[i]=='U' ){
				y++;
			}
			if( str[i]=='D' ){
				y--;
			}
			if( str[i]=='R' ){
				x++;
			}
			if( str[i]=='L' ){
				x--;
			}
			if( max<(abs(x)+abs(y)) ){
				max=(abs(x)+abs(y));
			}
		}
		
		cout << max << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值