Codeforces Round #619 (Div. 2) D. Time to Run(模拟+思维)

题目链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:这题感觉比C题简单啊,但是码量不够,花了一个多小时在debug,幸好最后一分钟的时候AC了。。。如题:我们是一定能够找到一条路径能够不重复的走完所有路的,那么该怎么走呢,看下面
在这里插入图片描述
我是按这种方式不重复的走完所有路的,只要一开始把所有的路构造出来,看看k到哪里就可以了,有个需要注意的店就是n或者m为1的时候注意一下,其他都是细节问题,至于代码将就看看吧,这个debug当时几乎搞得我精疲力竭,也实在没功夫把代码修饰一下,变量名什么都取得很随意了,关键还是构造路径那个地方。

#include<bits/stdc++.h>
using namespace std;
const int maxn=510;
typedef long long ll;
vector<pair<int,string>>ans,ans1;
map<string,int>p;
vector<char>temp;
vector<string>v;
int n,m,k,cnt=0;
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	if((4*n*m-2*n-2*m)<k) {
		puts("NO");return 0;
	}
	puts("YES");
	for(int i=1;i<=m-1;++i) temp.push_back('R');
	for(int i=1;i<=m-1;++i) temp.push_back('L');
	cnt=2*(m-1);
	for(int i=1;i<n;++i)
	{
		if(cnt<k) temp.push_back('D'),cnt++;
		for(int j=1;j<m;++j)
		{
			if(cnt<k) temp.push_back('R'),cnt++;
			if(cnt<k) temp.push_back('U'),cnt++;
			if(cnt<k) temp.push_back('D'),cnt++;
		}
		for(int j=1;j<m;++j) if(cnt<k) temp.push_back('L'),cnt++;
	}
	for(int i=1;i<n;++i) if(cnt<k) temp.push_back('U'),cnt++;
	if(m>1) ans.push_back({m-1,"R"});
	if(m>1) ans.push_back({m-1,"L"});
	for(int i=1;i<=n-1;++i)
	{
		if(m>1)ans.push_back({m-1,"DRU"});
		ans.push_back({1,"D"});
		if(m>1)ans.push_back({m-1,"L"});
	}
	 if(n>1)ans.push_back({n-1,"U"});
	ll sum=0;
	for(int i=0;i<ans.size();++i)
	{
		int t1=ans[i].first,t2=ans[i].second.size();
		if(sum+(t1*t2)>=k) {
			int num5=(k-sum)/t2;
			int num6=(k-sum-(t2*num5))%t2;
			if(num5!=0) ans1.push_back({num5,ans[i].second});
			if(num6!=0) 
			{
						string s2,ss=ans[i].second;
				for(int j=0;j<num6;++j) s2+=ss[j];
				ans1.push_back({1,s2});
			}
			break;
		}
		sum+=t1*t2;
		ans1.push_back({ans[i].first,ans[i].second});
	}
	cout<<ans1.size()<<endl;
	for(int i=0;i<ans1.size();++i) cout<<ans1[i].first<<" "<<ans1[i].second<<endl;;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值