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 }
View Code

 

正解:

  很像 方程的解数

  都是直接搜索会TLE 于是就对半 分开搜索 然后来匹配

 

  代码 ……还没有写出来qwq

posted @ 2019-01-23 22:00  DTTTTTTT  阅读(150)  评论(0编辑  收藏  举报