MYF

HDU 5718 Oracle

题目链接

HDU 5718

解题方法:乘法原理

题目分析

题目大意

中文题面

解析

官方解析:

先记录 $0-9$这$10$个数字分别有多少个。不难看出,最小的一个存在的数字和其余的数字降序排列的相加就是答案,但是最小的那个数字不能是$0$,因为题面上说明是正整数。将这两个数加起来时,注意处理进位问题。考虑无解的情况,即一串数字中仅存在$1$个非$0$数字或不存在。 (PS.这道题目原本的时限是$1s$,考虑到题目的难度和评测机的问题,开了$4s$,大家可以自己在FST以后看一下时间。 如果是时限是$1s$的话,$sort$是过不了的,输出也需要优化一下) 时间复杂度 $O(Tn)$。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <deque>
#include <algorithm>
#define Memset(a,val) memset(a,val,sizeof(a))
#define PI acos(-1)
#define rt(n) (i == n ? '\n' : ' ')
#define hi printf("Hi----------\n")
#define IN freopen("input.txt","r",stdin);
#define OUT freopen("output.txt","w",stdout);
#define debug(x) cout<<"Debug : ---"<<x<<"---"<<endl;
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long ll;
using namespace std;
const int maxn=100000+5;
const int mod=1000000007;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
char s[10000005];
bool cmp(char c1,char c2){
return c1>c2;
}
void work(){
scanf("%s",s);
int len =strlen(s);
sort(s, s+len,cmp);
for (int i=len-1; i>=0; i--) {
if (s[i]!='0') {
swap(s[i], s[len-1]);
break;
}
}
if (s[0]=='0'||len==1) {
cout<<"Uncertain"<<endl;
return;
}

bool flag=false;
int tmp =(s[len-2]-'0'+s[len-1]-'0');
if (tmp>=10) {
s[len-2]=tmp-10+'0';
flag=true;
}
else{
s[len-2]=tmp+'0';
}
if (flag) {
for (int i=len-3; i>=0&&flag; i--) {
if (s[i]=='9') {
s[i]='0';
}
else
{
s[i]++;
flag=false;
}

}
}
if (flag) {
printf("1");
}
for (int i =0 ; i<len-1; i++) {
printf("%c",s[i]);
}
printf("\n");
}
int main(){
int t;
cin>>t;
while (t--) {
work();
}
return 0;
}