摸起来了,摸鱼,永远滴神
A. Space Navigation
给定一个坐标和一串移动命令,可以删掉任意多个移动命令,问火箭能不能从(0,0)移动到给定坐标
只要统计每种命令的个数,火箭可以到达其固定的矩形范围内任意一点,判断即可。
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <set>
#include<vector>
#include<cmath>
#include <map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
ll n, t;
ll x,y;
string s;
ll dat[4];
int main() {
ios::sync_with_stdio(0);
cin >> t;
while (t--)
{
cin >> x >> y;
cin >> s;
memset(dat, 0, sizeof(dat));
for (int i = 0; i < s.size(); i++) {
if (s[i] == 'L')dat[0]++;
if (s[i] == 'R')dat[1]++;
if (s[i] == 'U')dat[2]++;
if (s[i] == 'D')dat[3]++;
}
int flag1 = 0, flag2 = 0;
if (x >= 0 && dat[1] >= x)flag1 = 1;
if (x < 0 && dat[0]>=abs(x))flag1 = 1;
if (y >= 0 && dat[2] >= y)flag2 = 1;
if (y < 0 && dat[3] >= abs(y))flag2 = 1;
if (flag1 && flag2)cout << "YES
";
else cout << "NO
";
}
}
B. New Colony
模拟
模拟
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <set>
#include<vector>
#include<cmath>
#include <map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
ll t;
ll n,k;
string s;
ll dat[1000];
int mv() {
int cur = 0;
while (1)
{
if (cur == n - 1)return -1;
if (dat[cur] >= dat[cur + 1])cur++;
else {
dat[cur]++;
return cur+1;
}
}
}
int main() {
ios::sync_with_stdio(0);
cin >> t;
while (t--)
{
cin >> n >> k;
for (int i = 0; i < n; i++)
cin >> dat[i];
int ans = 0;
for (int i = 0; i < k; i++) {
ans = mv();
if (ans == -1)break;
}
cout << ans << '
';
}
}
C. Fence Painting
一开始有个点没想到,改完了之后还是错的,比赛的时候就没写出来,结果是数组少打了个零???
要将一串栅栏漆上一定的颜色,给定栅栏一开始的颜色,再给定栅栏要漆上的颜色(都是一串数组),已经请来了一些艺术家,他们按顺序到来,可以给任意一个栅栏画上给定的颜色,但是不能跳过,问能不能成功给栅栏全部上色,如果能,还要输出每个艺术家上色的栅栏编号
1.用个vector数组存需要改变颜色的栅栏编号,vector下标是要漆上的颜色
2.统计每种颜色的艺术家个数以及需要改变上色的颜色个数,如果艺术家个数不够则不能成功上色
3.最后一个艺术家是最重要的,要是他有的颜色需要的栅栏没有就不可能成功上色,我们只要找到最后一个艺术家上色的位置编号,其他不需要的艺术家都在那个位置上色即可,如果这个位置原来的颜色和要上的色相同,还会占用一个该颜色的上色位
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <set>
#include<vector>
#include<cmath>
#include <map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
ll t;
ll n,m;
string s;
ll a[100000+5],b[100000+5],c[100000+5];
vector<int> dat[200000 + 5];
ll cnt[200000 + 5];
int main() {
ios::sync_with_stdio(0);
cin >> t;
while (t--)
{
vector<int> ans;
cin >> n >> m;
int pos=-1;
for (int i = 0; i < n; i++) {
cin >> a[i];
dat[i] = vector<int>();
cnt[i] = 0;
}
dat[n] = vector<int>();
cnt[n] = 0;
for (int i = 0; i < n; i++) {
cin >> b[i];
if (a[i] != b[i]) {
dat[b[i]].push_back(i);
}
}
for (int i = 0; i < m; i++) {
cin >> c[i];
cnt[c[i]]++;
}
int flag = 0;
int flag2 = 1;
for (int i = 0; i < n; i++) {
if (flag2&&b[i] == c[m - 1]) {
flag2 = 0;
pos = i;
}
if (!flag2&&a[i]!=b[i] && b[i] == c[m - 1]) {
flag2 = 0;
pos = i;
}
}
if (a[pos] == b[pos])cnt[b[pos]]--;
for (int i = 0; i < n; i++) {
if (a[i] != b[i])cnt[b[i]]--;
if (cnt[b[i]] < 0) {
flag = 1;
break;
}
}
if (flag+flag2) {
cout << "NO
";
continue;
}
for (int i = 0; i < m-1; i++) {
if (dat[c[i]].size() == 0)ans.push_back(pos);
else {
ans.push_back(dat[c[i]][0]);
dat[c[i]].erase(dat[c[i]].begin(), dat[c[i]].begin() + 1);
}
}
ans.push_back(pos);
cout << "YES
";
for (int i = 0; i < m; i++)cout << ans[i]+1 << ' ';
cout << '
';
}
}
D. AB Graph
给定一个完全图,每条边的边权为a或者b,给定一个长度m,在图里走,问能不能,如何走成一个长度为m的回文串
1.m为奇数,在两个点里转来转去就行
2.n是2,要两条边相同
3.m为偶数,在三个点里循环即可,先找到到一个点,指向其的边的边权和其指向下一个点的边权相同,反向走m/2的点找到启示点,转圈循环即可
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <set>
#include<vector>
#include<cmath>
#include <map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
ll t;
ll n,m;
string s;
char dat[10005][10005];
int main() {
ios::sync_with_stdio(0);
cin >> t;
while (t--)
{
cin >> n >> m;
for (int i = 0; i < n; i++)cin >> dat[i];
if (m % 2) {
cout << "YES
";
for (int i = 0; i <=m; i++)cout << 1 + i % 2 << ' ';
cout << '
';
continue;
}
if (n == 2) {
if (dat[0][1] == dat[1][0]) {
cout << "YES
";
for (int i = 0; i <=m; i++)cout << 1 + i % 2 << ' ';
cout << '
';
}
else cout << "NO
";
continue;
}
int pos;
for (int i = 0; i < 3; i++)
if (dat[i][(i + 1) % 3] == dat[(i - 1 + 3) % 3][i])pos = i;
cout << "YES
";
for (int i = 0; i < m/2; i++)pos=(pos-1+3)%3;
for (int i = 0; i <= m; i++)cout << 1 + (pos + i) % 3<<' ';
cout << '
';
}
}