Codeforces Round #699 (Div. 2) ABC

A. Space Navigation
题目太长我就不贴了,看链接吧

题意:

给你一组字符串,问在给定了字符串后,靠字符串的子序列能不能走到给定点

思路:

水题,统计UDLR的数量,判断一下即可

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int f1 = 0, f2 = 0, f3 = 0, f4 = 0;
		int x, y;
		string s;

		cin >> x >> y;
		cin >> s;
		for(int i=0; i<s.size(); i++)
		{
			if(s[i] == 'U')
			{
				f1++;
			}
			else if(s[i] == 'D')
			{
				f2++;
			}
			else if(s[i] == 'L')
			{
				f3++;
			}
			else if(s[i] == 'R')
			{
				f4++;
			}
		}
		int flag = 1;
		if(y > 0)
		{
			y = abs(y);
			if(f1 < y)
			{
				flag = 0;
			}
		}
		else if(y < 0)
		{
			y = abs(y);
			if(f2 < y)
			{
				flag = 0;
			}
		}
		if(x < 0)
		{
			x = abs(x);
			if(f3 < x)
			{
				flag = 0;
			}
		}
		else if(x > 0)
		{
			if(f4 < x)
			{
				flag = 0;
			}
		}
		if(flag)
		{
			puts("YES");
		}
		else
		{
			puts("NO");
		}
	}
	return 0;
}

B. New Colony

题意

从1开始滚动巨石,索引x的地方过不去,那么索引x-1的地方就+1,滚过终点则输出-1,问第k次滚动巨石的位置

思路

直接暴力模拟,k就是个摆设,最多不过100*100

#include<iostream>
#include<cmath>
using namespace std;
int a[150];
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int n, k;
		cin >> n >> k;
		for(int i=1; i<=n; i++)
		{
			cin >> a[i];
		}
		int flag;
		k = k >= 10000 ? 10000 : k;
		for(int i=1; i<=k; i++)
		{
			flag = -1;
			for(int j=1; j<n; j++)
			{
				if(a[j+1] > a[j])
				{
					a[j]++;
					flag = j;
					break;
				}
			}	
		}
		cout << flag << endl;
	}
	return 0;
}

C. Fence Painting

题意

一个人想要给篱笆刷漆,原本的颜色是ai,刷漆之后要变成bi,一个刷漆师傅只能把一块木板刷成ci,还得遵从先后顺序

思路

首先找到最后一个刷漆师傅可以刷的颜色,如果b里面没有,就直接pass掉,如果有,把最后一个刷漆师傅刷的颜色做个标记,也就是说,所有多余的刷漆师傅全部在这里刷,最后覆盖,其他人各自找各自的位置,判断一下能不能刷完,有剩余的就pass,没有就输出
ps:看代码可能更好点

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
int a[N], b[N], c[N];
int vis[N];
vector<int>v[N]; // 这里存的是与a[i]不同的b[i]的位置 
vector<int>v1[N]; // 这里存的是所有b[i]的位置 
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		map<int, int>mp; // 这里我要存数组b,目的是为了判断最后的c[m]是否存在
		int n, m;
		int cnt = 0;
		cin >> n >> m;
		for(int i=1; i<=n; i++)
		{
			cin >> a[i];
			v[i].clear();
			v1[i].clear();
		}
		for(int i=1; i<=n; i++)
		{
			cin >> b[i];
			if(a[i] != b[i])
			{
				v[b[i]].push_back(i); 
				cnt++; // 这里是总共要刷木板的数量 
			}
			mp[b[i]]++;
			v1[b[i]].push_back(i);
		}
		for(int i=1; i<=m; i++)
		{
			cin >> c[i];
		}		
		int flag = 0;		
		if(mp.count(c[m])) // 如果这个颜色存在 
		{
			if(v[c[m]].size() == 0) // 如果没有要刷的不同颜色,那就把颜色为b[i]的最后一个位置标记 
				flag = v1[c[m]][v1[c[m]].size()-1];
			else
				flag = v[c[m]][v[c[m]].size()-1]; //  有就把他标记一下 
		}
		if(!flag)
		{
			puts("NO");
			continue;
		}
		for(int i=1; i<=m; i++)
		{
			if(v[c[i]].size() != 0) // 如果有剩余的颜色没有刷 
			{
				vis[i] = v[c[i]][0];
				v[c[i]].erase(v[c[i]].begin());
				cnt--;
			}
			else // 如果没有就统一放到最后 
			{
				vis[i] = flag;
			}
		}
		vis[m] = flag;
		if(cnt == 0)
		{
			puts("YES");
			for(int i=1; i<=m; i++)
			{
				cout << vis[i] << " ";
			}
			puts("");
		}
		else
		{
			puts("NO");
		}
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值