题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058
心得:
DP问题,a[i]=min{ a[j]*2 , a[k]*3 , a[m]*5 , a[n]*7 }。
如果认为本题的重点是打表的话你就错了,英语序数词坑了无数人,所以下面我就不厌其烦把小学英语知识点再回顾一遍。
末位是1但后两位不是11的+st
末位是2但后两位不是12的+nd
末位是3但后两位不是13的+rd
代码:
#include <iostream>
using namespace std;
int min(int a,int b) {return a<=b?a:b;}
int main(){
int i1,i2,i3,i4;
int t1,t2,t3,t4;
int i,a[5843];
a[1]=1;
i1=i2=i3=i4=1;
for(i=2;i<5843;i++){
t1=a[i1]*2; t2=a[i2]*3;
t3=a[i3]*5; t4=a[i4]*7;
a[i]=min(min(t1,t2),min(t3,t4));
if(a[i]==t1) i1++;
if(a[i]==t2) i2++;
if(a[i]==t3) i3++;
if(a[i]==t4) i4++;
}
while(cin>>i,i!=0){
if (i%10==1 && i%100!=11) printf("The %dst humble number is %d.\n",i,a[i]);
else if(i%10==2 && i%100!=12) printf("The %dnd humble number is %d.\n",i,a[i]);
else if(i%10==3 && i%100!=13) printf("The %drd humble number is %d.\n",i,a[i]);
else printf("The %dth humble number is %d.\n",i,a[i]);
}
}