#include<stdio.h>
int GCD(int a, int b)
{
if(a>b) {a^=b^=a^=b;}
while(b%a)
{
b%=a;
if(a>b) {a^=b^=a^=b;}
}
return a;
}
int main()
{
int a,c,d,e,r;
float p;
while(scanf("%d%f",&c,&p)!=EOF)
{
d=GCD(e=(int)(p*1000),1000);
e/=d;
d=1000/d;
a=c;
while((int)(c*p))
{
if(c<d)
r=0;
else
r=c%d;
a+=c=(c-r)*e/d;
c+=r;
}
printf("%d\n",a);
}
return 0;
}
line2 : 84 0.167
我在自己電腦
用vc2012算出來是100
但這裡不論用c、c++都是:
WA (line:2)
答案不正確
您的答案為: 99 正確答案為: 100
想來想去覺得只有(int)(c*p)可能會照成誤差
於是改成下面寫法,雖然line沒問題了,但變成WA(line14)
不過我還是不懂line 2問題出在哪
#include<stdio.h>
int GCD(int a, int b)
{
if(a>b) {a^=b^=a^=b;}
while(b%a)
{
b%=a;
if(a>b) {a^=b^=a^=b;}
}
return a;
}
int main()
{
int a,c,d,e,r;
char p[6];
while(scanf("%d%s",&c,&p)!=EOF)
{
for(e=0,d=1,r=2;p[r]!='\0';r++,d*=10)
e=e*10+(p[r]-'0');
a=GCD(d,e);
d/=a;
e/=a;
a=c;
while(c*e>=d)
{
if(c<d)
r=0;
else
r=c%d;
a+=c=(c-r)*e/d;
c+=r;
}
printf("%d\n",a);
}
return 0;
}
Input
69 0.143
Output
80
手上有 69 個糖果紙, 拿 63 個兌換 9 個 // 63*0.143 = 9.009
手上有 15 個糖果紙, 拿 14 個兌換 2 個 // 14*0.143 = 2.002
手上有 3 個糖果紙, 無法兌換。
69 + 9 + 2 = 80
Input
84 0.167
Output
100
tricky test data
Input
872 0.81
769 0.53
54 0.3
Output
4574
1633
76
Don't use "double" or "float" type to solve this problem.
This problem won't be solved with easy "greedy" algorithm.
Input
69 0.143
Output
80
手上有 69 個糖果紙, 拿 63 個兌換 9 個 // 63*0.143 = 9.009
手上有 15 個糖果紙, 拿 14 個兌換 2 個 // 14*0.143 = 2.002
手上有 3 個糖果紙, 無法兌換。
69 + 9 + 2 = 80
Input
84 0.167
Output
100
tricky test data
Input
872 0.81
769 0.53
54 0.3
Output
4574
1633
76
Don't use "double" or "float" type to solve this problem.
This problem won't be solved with easy "greedy" algorithm.
感謝您的說明,我知道我原文的算法是不對的,先不論算法、答案對不對,我不明白的是同一份code,帶入一樣的值卻會有不同的答案,我一步一步debug看過程跟手算的一樣(line2的84,0.167),都是100,然而在我自己電腦跑出來是100,在此系統卻是99,我原文中第2個方法就沒有用double、float,也是一樣的結果,請問是因為不同編譯器造成的嗎?
追加一個問題,測資(line42)11,0.09,應該沒錯吧?
WA (line:42)
答案不正確
您的答案為: 11 正確答案為: 12
x*0.09 <= 11*0.09 = 0.99 ,for all 0<=x<=11
原題目說:只能兌換 n * p (無條件捨去取整數) 個糖果
即使第1次拿全部去換,0.99無條件捨去的話為0,所以無論拿幾張都無法換到糖果
所以答案不是11嗎?還是我對題意有哪裡弄錯了嗎?
所以答案不是11嗎?該是說0.99該先視為1呢?