【题目地址】http://vjudge.net/contest/142053#overview
Wannafly的第一次群赛,最终做了4个比较水的题,剩下两题听了q神解题方法之后还是不会写,自己实在太菜了。然后把这4题总结一下吧,期待下一次群赛!
A。简单搜索,但是需要非常仔细的读题!题意就是一个人开始的时候在迷宫的左端,然后迷宫里面有一些火车,车头向左,并且以2的速度向左开,这个人每次先向右移动一格,然后可以向上或者向下移动,问最后能否不被火车撞到,成功到达另外一边?
【AC代码】
#include <bits/stdc++.h>
using namespace std;
int n, k, sx;
char a[5][105];
typedef pair<int,int> P;
bool bfs(int sx){
queue<P>q; q.push(P(sx,1));
while(!q.empty()){
int x = q.front().first, y = q.front().second; q.pop();
if(isalpha(a[x][++y])) continue;
if(y >= n) return true;
for(int i = -1; i <= 1; i++){
int dx = x + i;
if(dx < 1 || dx > 3) continue;
if(isalpha(a[dx][y]) || isalpha(a[dx][y+1]) || isalpha(a[dx][y+2]) || a[dx][y+2] == 1) continue;
int dy = y + 2;
if(dy >= n) return true;
a[dx][dy] = 1;
q.push(P(dx,dy));
}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(a, 0, sizeof(a));
scanf("%d%d",&n,&k);
for(int i = 1; i <= 3; i++) scanf("%s",a[i]+1);
for(int i = 1; i <= 3; i++) if(a[i][1] == 's') sx = i;
if(bfs(sx)){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}
B。问能否在一个字符串里插入一个字符,使得这个字符串变成回文串?数据小,模拟。。
#include <bits/stdc++.h>
using namespace std;
bool check(string s)
{
int l = 0, r = s.size()-1;
while(l <= r){
if(s[l] != s[r]) return false;
l++,r--;
}
return true;
}
int main()
{
string s, ss;
cin>>s;
ss = "";
int sz = s.size();
for(int i = 0; i < 26; i++){
ss = char(i + 'a') + s;
if(check(ss)){
cout<<ss<<endl;
return 0;
}
ss = "";
ss = s + char(i + 'a');
if(check(ss)){
cout<<ss<<endl;
return 0;
}
}
for(int k = 0; k < 26; k++)
{
for(int i = 1; i < sz; i++){
ss = "";
for(int j = 0; j < i; j++) ss += s[j];
ss += char(k + 'a');
for(int j = i; j < sz; j++) ss += s[j];
if(check(ss)){
cout<<ss<<endl;
return 0;
}
}
}
cout<<"NA"<<endl;
}
D。在纸上推一推就可以发现,分奇偶答案固定。并且就是样例的两个答案。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
if(n%2==0){
printf("white\n");
printf("1 2\n");
}
else{
printf("black\n");
}
}
F。给了一下表达式,问能否找到一个数满足所有的表达式?
#include <bits/stdc++.h>
using namespace std;
string a,b,c;
int getnum(string s)
{
int ans = 0;
int sg;
int len = s.size();
if(s[0] == '-'){
sg = -1;
for(int i = 1; i < len; i++) ans = ans * 10 + s[i] - '0';
return sg*ans;
}
else{
for(int i = 0; i < len; i++) ans = ans * 10 + s[i] - '0';
}
return ans;
}
int main()
{
int n;
int mx1 = -(1e9+7);
int mx2 = -(1e9+7);
int mi1 = 1e9+7;
int mi2 = 1e9+7;
cin>>n;
for(int i = 0; i < n; i++){
cin>>a>>b>>c;
if(c == "Y")
{
if(a == ">") mx1 = max(mx1, getnum(b));
if(a == ">=") mx2 = max(mx2, getnum(b));
if(a == "<") mi1 = min(mi1, getnum(b));
if(a == "<=") mi2 = min(mi2, getnum(b));
}
else{
if(a == ">") mi2 = min(mi2, getnum(b));
if(a == ">=") mi1 = min(mi1, getnum(b));
if(a == "<") mx2 = max(mx2, getnum(b));
if(a == "<=") mx1 = max(mx1, getnum(b));
}
}
int mx = max(mx1, mx2);
if(mx == mx1) mx++;
int mi = min(mi1, mi2);
if(mi == mi1) mi--;
swap(mx, mi);
//cout<<mx<<" "<<mi<<endl;
if(mi > mx){
printf("Impossible\n");
}
else{
cout<<mi<<endl;
}
}