fuz 2159 WuYou

Problem 2159 WuYou

Accept: 16    Submit: 64
Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description

有两个正整数A和B,这两个数的位数相同且不含前缀0。A的一些位不能够确定,用‘?’代替。已知A是满足 A < B 的最大的A。求A 。

Input

第一行一个整数T(T<=1000),表示有T组数据。

每组数据两行,第一行为A,第二行为B(0 < A,B <= 10^10000)。

Output

对于每组数据,输出满足A<B的最大的A。如果不存在,输出-1。

Sample Input

3
1
9
?
8
?1
11

Sample Output

1
7
-1
 
 一开始做,思路都是错的。
思路:对于?而言,假如前面已经有数字不同了,那我不管就取9.
         假如前面是相同的,那么我要看后面的满足是否有满足小于的,有则去于另一个数字对应位置相同;否则,取另一个数字对应位-1 。
两种方式写。
 1 #include<iostream>

 2 #include<stdio.h>

 3 #include<cstring>

 4 #include<cstdlib>

 5 using namespace std;

 6 

 7 char a[100005];

 8 char b[100005];

 9 int alen,blen;

10 struct node

11 {

12     bool front_min;

13 }f[100005];

14 

15 void Init(int n)

16 {

17     int i;

18     for(i=0;i<=n;i++)

19     {

20         f[i].front_min=false;

21     }

22 }

23 void solve()

24 {

25     int i;

26     bool end_min=false;

27     for(i=alen-1;i>=0;i--)

28     {

29         if(a[i]!='?')

30         {

31             if(a[i]<b[i]) end_min=true;

32             else if(a[i]>b[i]) end_min=false;

33         }

34         else if(a[i]=='?')

35         {

36             if(f[i].front_min==true)

37             {

38                 a[i]='9';

39             }

40             else if(f[i].front_min==false && end_min==true)

41             {

42                 a[i]=b[i];

43             }

44             else if(f[i].front_min==false && end_min==false)

45             {

46                 if(b[i]=='0')

47                 {

48                     a[i]='9';

49                     end_min=false;

50                 }

51                 else

52                 {

53                     a[i]=b[i]-1;

54                     end_min=true;

55                 }

56             }

57         }

58     }

59     if(a[0]!='0' && strcmp(a,b)<0)

60     {

61         for(i=0;i<alen;i++) printf("%c",a[i]);

62         printf("\n");

63     }

64     else printf("-1\n");

65 }

66 int main()

67 {

68     int i,T;

69     bool front_min;

70     scanf("%d",&T);

71     getchar();

72     while(T--)

73     {

74         scanf("%s%s",a,b);

75         alen=strlen(a);

76         blen=strlen(b);

77         if(alen<blen){printf("-1\n");continue;}

78         Init(alen);

79         front_min=false;

80         for(i=0;i<alen;i++)

81         {

82             if(a[i]!='?' && a[i]!=b[i])

83             {

84                 front_min=true;

85             }

86             if(front_min==true)

87                 f[i].front_min=true;

88         }

89         solve();

90     }

91     return 0;

92 }

 搜索

 

 1 #include<iostream>

 2 #include<stdio.h>

 3 #include<cstring>

 4 #include<cstdlib>

 5 using namespace std;

 6 

 7 char a[100002];

 8 char b[100002];

 9 int alen,blen;

10 bool end_min;

11 

12 void dfs(bool front_min,int i)

13 {

14     if(a[i]=='\0') return;

15     if(a[i]!='?')

16     {

17         if(a[i]!=b[i])

18             front_min=true;

19     }

20     dfs(front_min,i+1);

21     if(a[i]=='?')

22     {

23         if(front_min==true)

24         {

25             a[i]='9';

26         }

27         else if(front_min==false && end_min==true)

28         {

29             a[i]=b[i];

30         }

31         else if(front_min==false && end_min==false)

32         {

33             if(b[i]=='0')

34             {

35                 a[i]='9';

36                 end_min=false;

37             }

38             else

39             {

40                 a[i]=b[i]-1;

41                 end_min=true;

42             }

43         }

44     }

45     else if(a[i]!='?')

46     {

47         if(a[i]<b[i])

48             end_min=true;

49         else if(a[i]>b[i])

50             end_min=false;

51     }

52 }

53 int main()

54 {

55     int T;

56     scanf("%d",&T);

57     while(T--)

58     {

59         scanf("%s%s",a,b);

60         alen=strlen(a);

61         blen=strlen(b);

62         if(alen<blen){printf("-1\n");continue;}

63 

64         end_min=false;

65         dfs(false,0);

66         if(a[0]!='0' && strcmp(a,b)<0)

67         {

68             printf("%s\n",a);

69         }

70         else printf("-1\n");

71     }

72     return 0;

73 }

 

你可能感兴趣的:(you)