【HDOJ】4608 I-number

【题目】http://acm.hdu.edu.cn/showproblem.php?pid=4608

【报告】

    最直接的,一个很简单粗暴的思路,就是1个1个加上去,加的时候和进位的时候维护一下整个数的数位和。理论上应该是可行的,而且应该不会加很多次(我也不知道加几次,随机了几个数感觉10次到顶了。。)

    我不是那样做的。采用构造法。个位特殊判断,直接判断个位上的数字加上去之后能不能使符合要求,能的话就直接加了(比如202->208)。对于十位以及更高位数的,如果当前位是9,那么忽略之,如果不是9,那么+1,然后把后面全部清零,个位上再补上不够的。

    然后就一次AC了。。

【程序】

// Task: 4608 I-number
// Designer: Rsky 2013/09/03
#include
#include
#include
#include
#include
using namespace std;
const int N = 100000;
char c[N+1000];
int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        memset(c,0,sizeof(c));
        strcpy(c,"000");
        scanf("%s",c+1);
        int k=0;
        for (int i=strlen(c)-1;i>=0;i--)
            k+=c[i]-'0';
        for (int i=strlen(c)-1;i>=0;i--)
        {
            if (c[i]-'0'<9)
            { // 可以加
                int w=strlen(c)-1-i;  // 记录当前位后面的位数,0的个数
                if (w*9+9-c[i]+'0'>=10-k)  // 可以构造
                {
                    if (w>0)  // 后面有位数
                    {
                        c[i]++;
                        c[strlen(c)-1]+=10-k-1;
                     

posted @ 2013-09-03 19:24  为美好世界献上珂学  阅读(85)  评论(0编辑  收藏  举报