HDU 4726 Kia's Calculation(数学+贪心)

来源:互联网 发布:表单令牌的作用 php 编辑:程序博客网 时间:2024/04/25 11:41

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4726

这个题目要注意第一个位置要特殊处理下,因为第一个不为0,之后的和求第一个的思路一样

贪心的从大到小找,也就是说尽量把组合大的数放到数的前面,这样才能保证最后的结果最大

这里的思路可能很常见,但是有些代码的写法还是值得注意的!


#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>using namespace std;#define MIN(a,b) (a<b?a:b)const int maxn=1e6+1;char a[maxn],b[maxn];int num1[10],num2[10];int n;int find_first(){    int i,j,k;    for(i=9;i>=1;i--){//这里从1开始是为了防止首位是0        for(j=1;j<=9;j++){            if(i>j && num1[j] && num2[i-j]){                num1[j]--,num2[i-j]--;break;            }            if(10+i-j<=9 && num1[j] && num2[10+i-j]){                num1[j]--;num2[10+i-j]--;break;            }        }        if(j<=9) break;    }    return i;}int find_ans(int n){    int ans=0,i,j,k;    for(i=0;i<10;i++){        if(n-i>=0 && num1[i] && num2[n-i]){            k=MIN(num1[i],num2[n-i]);            ans+=k;            num1[i]-=k,num2[n-i]-=k;        }        if(10+n-i<10 && num1[i] && num2[10+n-i]){            k=MIN(num1[i],num2[10+n-i]);            ans+=k;            num1[i]-=k,num2[10+n-i]-=k;        }    }    return ans;}int main(){    int i,j,k,t,cas=0;    scanf("%d",&t);    while(t--){        scanf("%s%s",a,b);        n=strlen(a);        memset(num1,0,sizeof(num1));        memset(num2,0,sizeof(num2));        for(i=0;i<n;i++){            num1[a[i]-'0']++;            num2[b[i]-'0']++;        }        printf("Case #%d: ",++cas);        k=find_first();        printf("%d",k);        if(k==0){printf("\n");continue;}        for(i=9;i>=0;i--){            k=find_ans(i);            while(k--){                printf("%d",i);            }        }        printf("\n");    }    return 0;}


原创粉丝点击