Hdu 5718 Oracle【贪心】

前端之家收集整理的这篇文章主要介绍了Hdu 5718 Oracle【贪心】前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Oracle

Accepts: 599

Submissions: 2576

Time Limit: 8000/4000 MS (Java/Others)

Memory Limit: 262144/262144 K (Java/Others)

问题描述

曾经有一位国王,统治着一片未名之地。他膝下有三个女儿。

三个女儿中最年轻漂亮的当属Psyche。她的父亲不确定她未来的命运,于是他来到Delphi神庙求神谕。

神谕可以看作一个不含前导零的正整数n n n。

为了得到真正的预言,他可以将n n n的各个数位重新排列,并将其分成两个不含前导零的正整数

请你帮助他求出这两个正整数最大的和。如果不存在这样的两个正整数,输出"Uncertain".

输入描述

第一行一个整数T T T (1≤T≤10) (1 \le T \le 10) (1≤T≤10),代表数据组数。

接下来T T T行,每行一个正整数n n n (1≤n<1010000000) (1 \le n < 10 ^ {10000000}) (1≤n<1010000000​)。

输出描述

对于每组数据,输出一个整数表示最大的和。若不存在一种方案,输出"Uncertain".

输入样例

3

112

233

1

输出样例

22

35

Uncertain

Hint

对于第一组数据,最优方案是将112 112 112分成21 21 21和1 1 1,最大的和为21+1=22 21 + 1 = 22 21+1=22。

对于第二组数据,最优方案是将233 233 233分成2 2 2和33 33 33,最大的和为2+33=35 2 + 33 = 35 2+33=35。

对于第三组数据,显然无法将一个数位分成两部分。

建议使用效率较高的读入方式。

思路:

1、首先,正整数不包括0.那么10000000000000这样的数据,应该输出Uncertain。

2、如果为了将一个数拆分成两个数并且保证其家和最大,那么其实就是一个长度为n-1的数和一个长度为1的数加和,能够保证数据最大。

3、那么根据刚才贪心的思路,找一个最小的个位数作为长度为1的数,剩下的数再贪心的将其拼接为一个最大的数,然后模拟加和即可。

4、因为正整数不包括0,那么其拆分出来的长度为1的数也不能是0,那么例如1111000这样数的最终解千万别模拟错了。

Ac代码

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. using namespace std;
  5. char a[10000500];
  6. int aa[10000500];
  7. int ans[100005000];
  8. int main()
  9. {
  10. int t;
  11. scanf("%d",&t);
  12. while(t--)
  13. {
  14. memset(a,'0',sizeof(a));
  15. memset(aa,sizeof(aa));
  16. scanf("%s",a);
  17. int n=strlen(a);
  18. if(n==1)
  19. {
  20. printf("Uncertain\n");
  21. continue;
  22. }
  23. for(int i=0;i<n;i++)
  24. {
  25. aa[i]=a[i]-'0';
  26. }
  27. int dd=0;
  28. sort(aa,aa+n);
  29. reverse(aa,aa+n);
  30. int i=n-1;
  31. int pos;
  32. int flag=0;
  33. while(i>=0)
  34. {
  35. if(aa[i]==0)
  36. {
  37. i--;
  38. }
  39. else
  40. {
  41. dd=aa[i];
  42. if(i==n-1)
  43. {
  44. aa[i-1]+=dd;
  45. }
  46. else
  47. {
  48. flag=1;
  49. }
  50. pos=i;
  51. break;
  52. }
  53. }
  54. if(i==0)
  55. {
  56. printf("Uncertain\n");
  57. continue;
  58. }
  59. ans[0]=0;
  60. int cont=1;
  61. for(int i=0;i<n;i++)
  62. {
  63. if(i==pos)continue;
  64. ans[cont++]=aa[i];
  65. }
  66. if(flag==1)
  67. {
  68. ans[cont-1]+=dd;
  69. }
  70. i=cont-1;
  71. while(i>=0)
  72. {
  73. if(ans[i]>=10)ans[i]-=10,ans[i-1]+=1;
  74. else break;
  75. i--;
  76. }
  77. for(int i=0;i<cont;i++)
  78. {
  79. if(i==0&&ans[i]==0)continue;
  80. printf("%d",ans[i]);
  81. }
  82. printf("\n");
  83. }
  84. }

猜你在找的Oracle相关文章