TC-572-D1L2 未完!待续!
题目描述
• 有一个神秘的常数 K ,s 位
• 现在有 n 个 s 位数,告诉你每个数与 K 有多少位是相同的
• 判断 K 的无解、多解、唯一解,并求出唯一解(如果存在的话)
• 所有出现的数都允许前导零
• s ≤ 9, n ≤ 50
输入格式
第一行两个数 n, s 。
接下来 n 行,每行两个数 a, b 表示 s 位数 a 与 K 有 b 位是相同的。
输出格式
无解输出 Liar , 多解输出 Ambiguity ,唯一解则输出唯一解。
cute gql教我的70分做法:
从低位搜到高位(倒过来也可以啊) 边搜边判断 然后 没了
这样子做的代码也敲一下了啦 (其实应该比70还多)
1 #include<iostream> 2 #include<cstdio> 3 #define go(i,u,v) for(register int i=u;i<=v;i++) 4 #define goo(i,u,v) for(register int i=u;i>=v;i--) 5 using namespace std; 6 int read() 7 { 8 int x=0,y=1;char c=getchar(); 9 while(c<'0'||c>'9') {if(c=='-') y=-1;c=getchar();} 10 while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-'0';c=getchar();} 11 return x*y; 12 } 13 int n,m,a[60],b[60],c[60][10],ans,d[60],now[10],as[60]; 14 bool ck() {go(i,1,n) if(d[i]!=b[i]) return 0; return 1;} 15 void dfs(int nw) 16 { 17 if(nw>m) {if(ck()) {ans++;go(i,1,m) as[i]=now[i];}return ;} 18 go(i,0,9) { 19 bool fg=1; 20 go(j,1,n) { if(c[j][nw]==i&&d[j]+1>b[j]) {fg=0;break ;} } 21 if(!fg) continue ; 22 go(j,1,n) { if(c[j][nw]==i) d[j]++; } 23 now[nw]=i;dfs(nw+1); 24 go(j,1,n) { if(c[j][nw]==i) d[j]--; } 25 } 26 } 27 int main() 28 { 29 n=read();m=read(); 30 go(i,1,n) a[i]=read(),b[i]=read(); 31 go(i,1,n) go(j,1,m) {c[i][j]=a[i]%10;a[i]/=10;} 32 dfs(1); 33 if(!ans) puts("Liar"); 34 else if(ans>1) puts("Ambiguity"); 35 else { goo(i,m,1) printf("%d",as[i]);} 36 return 0; 37 }
正解:
很像 方程的解数
都是直接搜索会TLE 于是就对半 分开搜索 然后来匹配
代码 ……还没有写出来qwq
光伴随的阴影