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;
}
题意
从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;
}
题意
一个人想要给篱笆刷漆,原本的颜色是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;
}