码迷,mamicode.com
首页 > 其他好文 > 详细

贪心 HDOJ 4726 Kia's Calculation

时间:2015-04-19 21:22:32      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

 

题目传送门

  1 /*
  2     这题交给队友做,做了一个多小时,全排列,RE数组越界,赛后发现读题读错了,囧!
  3     贪心:先确定最高位的数字,然后用贪心的方法,越高位数字越大
  4 
  5     注意:1. Both A and B will have same number of digits 两个数字位数相同
  6             2. which is no larger than 10 6 不是大小,而是长度不超过1e6
  7 */
  8 #include <cstdio>
  9 #include <iostream>
 10 #include <algorithm>
 11 #include <cstring>
 12 #include <string>
 13 #include <cmath>
 14 using namespace std;
 15 
 16 const int MAXN = 1e6 + 10;
 17 const int INF = 0x3f3f3f3f;
 18 char s1[MAXN], s2[MAXN];
 19 
 20 int main(void)        //HDOJ 4726    Kia‘s Calculation
 21 {
 22     //freopen ("K.in", "r", stdin);
 23 
 24     int t, cas = 0;
 25     int cnt1[11], cnt2[11], cnt3[11];
 26 
 27     scanf ("%d", &t);
 28     while (t--)
 29     {
 30         scanf ("%s", &s1);
 31         scanf ("%s", &s2);
 32 
 33         printf ("Case #%d: ", ++cas);
 34 
 35         int len = strlen (s1);
 36         if (strcmp (s1, "0") == 0)
 37         {
 38             printf ("%s\n", s2);    continue;
 39         }
 40         else if (strcmp (s2, "0") == 0)
 41         {
 42             printf ("%s\n", s1);    continue;
 43         }
 44 
 45         memset (cnt1, 0, sizeof (cnt1));
 46         memset (cnt2, 0, sizeof (cnt2));
 47         memset (cnt3, 0, sizeof (cnt3));
 48 
 49         for (int i=0; i<len; ++i)
 50         {
 51             cnt1[s1[i]-0]++;    cnt2[s2[i]-0]++;
 52         }
 53 
 54         int ii = 1, jj = 1, mx = -1;
 55         for (int i=1; i<=9; ++i)
 56         {
 57             if (cnt1[i] == 0)    continue;
 58             for (int j=1; j<=9; ++j)
 59             {
 60                 if (cnt2[j] == 0)    continue;
 61                 int tmp = (i + j) % 10;
 62                 if (tmp > mx)
 63                 {
 64                     mx = tmp;    ii = i;    jj = j;
 65                 }
 66             }
 67         }
 68         cnt1[ii]--;    cnt2[jj]--;
 69         if (!mx)
 70         {
 71             puts ("0");        continue;
 72         }
 73 
 74         for (int i=9; i>=0; --i)
 75         {
 76             for (int j=0; j<=9; ++j)
 77             {
 78                 for (int k=0; k<=9; ++k)
 79                 {
 80                     if ((j+k)%10==i && cnt1[j] && cnt2[k])
 81                     {
 82                         int tmp = min (cnt1[j], cnt2[k]);
 83                         cnt1[j] -= tmp;    cnt2[k] -= tmp;
 84                         cnt3[i] += tmp;
 85                     }
 86                 }
 87             }
 88         }
 89 
 90         printf ("%d", mx);
 91         for (int i=9; i>=0; --i)
 92         {
 93             for (int j=0; j<cnt3[i]; ++j)    printf ("%d", i);
 94         }
 95         puts ("");
 96     }
 97 
 98 
 99     return 0;
100 }

 

贪心 HDOJ 4726 Kia's Calculation

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4439887.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!