题目链接:点击打开链接
题目大意:每天给x张券,但是只能每天用其兑换 floor(w*a/b)的money,现在想兑的钱最多,并且每天剩下的券也最多(每天剩下的券不累计兑钱,仅作收藏用)
题目分析:
自己代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include<cmath>
using namespace std;
int b[105];
int main()
{
int n,a,b,w;
while(scanf("%d%d%d",&n,&a,&b)!=EOF)
{
for(int i=1; i<=n; i++)
{
scanf("%d",&w);
long long ans=(long long) w*a/b;//不在w前面加(long long)会错的,因为默认计算也存在int类型中
if (ans>=w)
printf("0 ");
else
{
ans=w-ceil((double)ans*b/a);//向回求需要使用的券张数,所以应该为向上取整
printf("%I64d ",ans);//cf上用I64D
}
}
printf("\n");
}
return 0;
}
正解代码
#include <iostream>
using namespace std;
int main()
{
long long int n,a,b,x;
cin>>n>>a>>b;
for(int i=0;i<n;i++)
{
cin>>x;
cout<<x*a%b/a<<' ';
}
}
总结:正确的代买总是简洁明了的,虽然第一种方法不错,但是易错