NOIP普及组第一题:买铅笔

参加考试的时候,第一题我足足花了四十多分钟(因为那奇葩的键盘,幸好我向老师报告更换了键盘),还是只得了五十分。。。

题目描述:

P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。

商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物。

现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱。

然后贴一下50分代码:

#include 
#include 
#include 
#include 
#include 
using namespace std;
int n,p[4],v[4],ans[4];
int main(){
    freopen("pencil.in","r",stdin);
    freopen("pencil.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=3;i++){
        scanf("%d%d",&p[i],&v[i]);
    }
    for(int i=1;i<=3;i++){
        ans[i]=int(double(n)/p[i]+1)*v[i];
    }
    ans[0]=min(ans[1],ans[2]);
    ans[0]=min(ans[0],ans[3]);
    printf("%d\n",ans[0]);
    return 0;
}

这题是简单的数学计算,然后比较最小值。

出错的地方是ans[i]=int(double(n)/p[i]+1)*v[i];这一句上。

我的想法是让n/p[i]得到的值是小数位补足进1的。而真正的int和int相除的得数是默认舍去小数为的,与自动补足进1相反。所以我捣鼓了半天,样例数据过了,还是没有拿到满分。

而真正的进1补满方法是

if(n%p[i]==0)  ans[i]=(n/p[i])*v[i];
else           ans[i]=(n/p[i]+1)*v[i];

贴上满分代码:

#include 
#include 
#include 
#include 
#include 
using namespace std;
int n,p[4],v[4],ans[4];
int main(){
    freopen("pencil.in","r",stdin);
    freopen("pencil.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=3;i++){
        scanf("%d%d",&p[i],&v[i]);
    }
    for(int i=1;i<=3;i++){
        if(n%p[i]==0)  ans[i]=(n/p[i])*v[i];
        else           ans[i]=(n/p[i]+1)*v[i];
    }
    ans[0]=min(ans[1],ans[2]);
    ans[0]=min(ans[0],ans[3]);
    printf("%d\n",ans[0]);
    return 0;
}

你可能感兴趣的:(NOIP)