标签:
这场CF终于当了一次手速狗啊,简直了啊。
A:签到,输出一个蛇形,看着样例找到规律打印路径就可以了。
int main() { int n, m; while(cin >>n>>m) { for(int i = 1; i <= n; i++) { if(i%2) { for(int j = 0; j < m; j++) cout<<"#"; cout<<endl; } else { int xp = i/2; if(xp%2) { for(int j = 0; j < m-1; j++) cout<<"."; cout<<"#"<<endl; } else { cout<<"#"; for(int j = 0; j < m-1; j++) cout<<"."; cout<<endl; } } } } }B.预处理出来所有点之间的关系然后用dfs判断是否构成环,保证每个点只被搜一次,所以时间复杂度不是很高。
const int maxn = 110; char str[maxn][maxn]; vector<int>g[maxn*maxn]; int vis[maxn*maxn]; int dx[] = {0, 1, -1, 0}; int dy[] = {1, 0, 0, -1}; int flag; void dfs(int x, int fa) { int n = g[x].size(); vis[x] = 1; for(int i = 0; i < n; i++) { int xp = g[x][i]; if(xp == fa) continue; if(vis[xp]) { flag = 1; continue; } else { dfs(xp, x); } } } int main() { int n, m; while(cin >>n>>m) { for(int i = 1; i <= n; i++) scanf("%s",str[i]+1); for(int i = 0; i <= n*m; i++) g[i].clear(); for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { int pos = (i-1)*m+j; for(int k = 0; k < 4; k++) { int x = i+dx[k]; int y = j+dy[k]; if(x > n || x < 1 || y > m || y < 1) continue; int xpos = (x-1)*m+y; if(str[i][j] == str[x][y]) { g[pos].push_back(xpos); } } } } memset(vis, 0, sizeof(vis)); flag = 0; for(int i = 1; i <= n*m; i++) { if(!vis[i]) { dfs(i, -1); } } if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }
2
aa
a
这种情况,没去hack有点失误。
using namespace std; const int maxn = 110; char str[maxn][maxn]; int mp[maxn][maxn]; int in[maxn]; int num[maxn]; int f[maxn]; int main() { int n; while(cin >>n) { for(int i = 0; i < n; i++) { scanf("%s",str[i]); } for(int i = 0; i < n; i++) { num[i] = strlen(str[i]); } memset(mp, 0, sizeof(mp)); memset(in, 0, sizeof(in)); int xflag = 0; for(int i = 0; i < n-1; i++) { int m = min(num[i], num[i+1]); int xnum = 0; for(int j = 0; j < m; j++) { if(str[i][j] != str[i+1][j]) { int x = str[i][j]-'a'; int y = str[i+1][j]-'a'; if(mp[x][y] == 0) { mp[x][y] = 1; in[y]++; } break; } xnum++; } if(xnum == m) { if(num[i] > num[i+1]) { xflag = 1; } } } if(xflag) { puts("Impossible"); continue; } int num = 0; int t; while(num != 26) { int flag = 0; for(int i = 0; i < 26; i++) { if(in[i] == 0) { flag = 1; in[i] = -1; f[num++] = i; t = i; break; } } if(!flag) break; for(int i = 0; i < 26; i++) { if(mp[t][i] == 1) { in[i]--; } } } if(num != 26) { cout<<"Impossible"<<endl; continue; } for(int i = 0; i < 26; i++) printf("%c",'a'+f[i]); cout<<endl; } }
const int maxn = 30010; using namespace std; int main() { int n; while(cin >>n) { vector<int>f; vector<int>p; int x; for(int i = 0; i < n; i++) { cin >>x; f.push_back(x); } for(int i = 0; i < n; i++) { cin >>x; p.push_back(x); } map<int, int> mp; map<int, int>::iterator it; for(int i = 0; i < n; i++) { int &x = mp[f[i]]; if(x == 0) x = p[i]; else x = min(p[i], x); for(it = mp.begin(); it != mp.end(); it++) { int &y = mp[__gcd(f[i], it->first)]; if(y == 0) y = p[i]+it->second; else y = min(y, p[i]+it->second); } } if(mp[1]) { cout<<mp[1]<<endl; continue; } puts("-1"); } }
Codeforces Round #290 (Div. 2) A,B,C,D
标签:
原文地址:http://blog.csdn.net/xu12110501127/article/details/43451599