换了新ID,以前的ID 运气不好
D:题目隐藏的很深啊!如果说拓扑排序肯定会写,模型转换。
计算每个点'.'的度,度:周围4个点为'.'的数目。
然后BFS 枚举度为1的点 ,一遍构造,链接的点就度--;
再压入队列中
当枚举的点数不够'.'数目时,答案就是'unique';
题目没要你输出any 这本身有蹊跷。
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> #include<string> using namespace std; #define N 2222 #define pii pair<int,int> #define mp make_pair int du[N][N]; char f[2][5]={"^<v>","v>^<"}; int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1}; char s[N][N]; int cal(int i,int j) { int ans=0; ans+=(s[i][j-1]=='.'); ans+=(s[i][j+1]=='.'); ans+=(s[i+1][j]=='.'); ans+=(s[i-1][j]=='.'); return ans; } int main() { int n,m; cin>>n>>m; for (int i=1;i<=n;i++) scanf("%s",s[i]+1); queue<pii> Q; int cnt=0; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (s[i][j]=='.') { cnt++; du[i][j]=cal(i,j); if (du[i][j]==1) Q.push(mp(i,j)); } if (cnt&1) { puts("Not unique"); return 0; } while (!Q.empty()) { pii cur=Q.front(); Q.pop(); int x=cur.first; int y=cur.second; if (s[x][y]=='.') { int i; int xx,yy; for (i=0;i<4;i++) { xx=x+dx[i]; yy=y+dy[i]; if (s[xx][yy]=='.') break; } if (i==4) { puts("Not unique"); return 0; } s[x][y]=f[0][i]; s[xx][yy]=f[1][i]; du[x][y]=du[xx][yy]=0; cnt-=2; for (int i=0;i<4;i++) { int nx=xx+dx[i]; int ny=yy+dy[i]; if (s[nx][ny]=='.') { du[nx][ny]--; if (du[nx][ny]==1) Q.push(mp(nx,ny)); } } } } if (cnt!=0) puts("Not unique"); else for (int i=1;i<=n;i++) printf("%s ",s[i]+1); return 0; }
C:一眼贪心题;
做法就是拆数,比如8的话就拆成2*2*2;
9的话是9!,也就是3*3*2^4;
然后比如有一个7 那么6,5,4,3,2,1的数目依次-1;
1 #include<stdio.h> 2 #include<string> 3 #include<iostream> 4 #include<queue> 5 #include<cmath> 6 #include<string.h> 7 #include <vector> 8 #include<map> 9 #include<stack> 10 using namespace std; 11 typedef long long ll; 12 13 string s; 14 int b[33333]; 15 int c[333333]; 16 17 int main() 18 { 19 int n; 20 cin>>n; 21 cin>>s; 22 int p=0; 23 while (s[p]=='0'&&p<s.size()) p++; 24 for (p;p<n;p++) 25 { 26 if (s[p]=='9') { 27 b[3]+=2; 28 b[2]+=3; 29 for (int i=7;i>=2;i--) b[i]++; 30 } 31 else if (s[p]=='8') 32 { 33 b[2]+=3; 34 for (int i=7;i>=2;i--) b[i]++; 35 } 36 37 else if (s[p]=='7') 38 { 39 for (int i=7;i>=2;i--) b[i]++; 40 } 41 else if (s[p]=='6') for (int i=6;i>=2;i--) b[i]++; 42 else if (s[p]=='5') for (int i=5;i>=2;i--) b[i]++; 43 else if (s[p]=='4') for (int i=4;i>=2;i--) b[i]++; 44 else if (s[p]=='3') for (int i=3;i>=2;i--) b[i]++; 45 else if (s[p]=='2') b[2]++; 46 } 47 48 while (b[7]) 49 { 50 c[7]++; 51 b[7]--; 52 53 for (int i=6;i>=2;i--) 54 { 55 //c[i]++; 56 b[i]--; 57 } 58 } 59 while (b[6]) 60 { 61 b[6]--; 62 b[2]++; 63 b[3]++; 64 } 65 66 while (b[5]) 67 { 68 c[5]++; 69 b[5]--; 70 for (int i=4;i>=2;i--) 71 { 72 //c[i]++; 73 b[i]--; 74 } 75 } 76 77 while (b[4]) 78 { 79 b[4]--; 80 b[2]+=2; 81 } 82 83 while (b[3]) 84 { 85 c[3]++; 86 b[3]--; 87 // c[2]++; 88 b[2]--; 89 } 90 91 while (b[2]) 92 { 93 c[2]++; 94 b[2]--; 95 96 } 97 for (int i=9;i>=2;i--) 98 while (c[i]) 99 { 100 cout<<i; 101 c[i]--; 102 } 103 return 0; 104 }
B:无限暴力下就好了
1 #include<stdio.h> 2 #include<string> 3 #include<iostream> 4 #include<queue> 5 #include<cmath> 6 #include<string.h> 7 #include <vector> 8 #include<map> 9 #include<stack> 10 using namespace std; 11 typedef long long ll; 12 13 int a[123],b[123]; 14 int main() 15 { 16 17 int n,m; 18 cin>>n>>m; 19 int nn; 20 int mm; 21 cin>>nn; 22 int x; 23 for (int i=1;i<=nn;i++) cin>>x,a[x]=1; 24 cin>>mm; 25 for (int i=1;i<=mm;i++) cin>>x,b[x]=1; 26 27 int ans=nn+mm; 28 int t=0; 29 while (t<3000000) 30 { 31 t++; 32 if (ans==n+m) 33 { 34 cout<<"Yes"; 35 return 0; 36 } 37 if (!a[t%n]&&b[t%m]) 38 { 39 ans++; 40 a[t%n]=1; 41 } 42 else if (a[t%n]&&!b[t%m]) 43 { 44 ans++; 45 b[t%m]=1; 46 } 47 } 48 cout<<"No"; 49 return 0; 50 }
20