• 贪心 HDOJ 4726 Kia's Calculation


    题目传送门

      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
    ", s2);    continue;
     39         }
     40         else if (strcmp (s2, "0") == 0)
     41         {
     42             printf ("%s
    ", 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 }
    编译人生,运行世界!
  • 相关阅读:
    LG gram 双系统全指南
    离散数学读书记录
    研究小报告:掺杂硅脂对处理器散热能力的影响
    SICP 课程总结 & 复习
    maxHeap 的 python 实现
    KDD Cup 2018 冠军团队 思路分享
    mergeSort, quickSort, shellSort 的 python 实现
    数据集-搜集
    【NOIP2018模拟赛】
    【NOIP2018 模拟】
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4439887.html
Copyright © 2020-2023  润新知