2015年7月28日 星期二

[UVA] 1583 - Digit Generator

題意:
輸入Y,求出Y的最小生成元,
生成元定義為X+X的各個位數數字的和,
例如:Y=216,X=207,198
因為207+2+0+7=216,198+1+9+8=216,
題目要最小的,所以取198為答案。

題解:
如果直接一個一個找小於Y的所有生成元會超時,
這一題可以建表,再直接輸出所求即可。
table[y]=x; 意即 y的生成元為x
^0 ^ /
/* 20150728
 * hanting
 * UVa 1583 - Digit Generator
 * C++
 */
#include <iostream>
using namespace std;
const int MAXN=99999+9*5;
inline int Generate(int &n)
{
    return n+n%10+n/10%10+n/100%10+n/1000%10+n/10000%10;
}
int main()
{
    /*Build Table*/
    int table[MAXN]={0};
    for(int i=100000;i>=0;i--)//倒著回來可得min
    {
        table[Generate(i)]=i;
    }
    int N;
    cin>>N;
    while(N--)
    {
        int num;
        cin>>num;
        cout<<table[num]<<endl;
    }
    return 0;
}

沒有留言:

張貼留言