#7581: WA line2 不知問題在哪


kkmomo (kkmomo)

學校 : 不指定學校
編號 : 29247
來源 : [223.137.94.20]
最後登入時間 :
2024-06-28 12:05:12
a646. 小民買糖果 -- 中央助教 | From: [111.249.88.168] | 發表日期 : 2013-03-15 23:19

#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;
}
 
 
#7582: Re:WA line2 不知問題在哪


morris1028 (碼畜)

學校 : 國立花蓮高級中學
編號 : 3529
來源 : [114.37.59.62]
最後登入時間 :
2021-07-12 19:00:43
a646. 小民買糖果 -- 中央助教 | From: [140.115.218.163] | 發表日期 : 2013-03-16 08:21

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.

 
#7585: Re:WA line2 不知問題在哪


kkmomo (kkmomo)

學校 : 不指定學校
編號 : 29247
來源 : [223.137.94.20]
最後登入時間 :
2024-06-28 12:05:12
a646. 小民買糖果 -- 中央助教 | From: [111.249.92.66] | 發表日期 : 2013-03-16 17:39

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呢?
 
#7586: Re:WA line2 不知問題在哪


kkmomo (kkmomo)

學校 : 不指定學校
編號 : 29247
來源 : [223.137.94.20]
最後登入時間 :
2024-06-28 12:05:12
a646. 小民買糖果 -- 中央助教 | From: [111.249.92.66] | 發表日期 : 2013-03-16 17:46

不好意思,沒注意一些錯字,還不小心複製了同一段話,應該不影響我想表達的意思,但還是補充一下
 最後一行是想問:還是說0.99應該先視為1再無條件捨去,所以會是11*0.99=1,11+1=12呢?


 
#7587: Re:WA line2 不知問題在哪


morris1028 (碼畜)

學校 : 國立花蓮高級中學
編號 : 3529
來源 : [114.37.59.62]
最後登入時間 :
2021-07-12 19:00:43
a646. 小民買糖果 -- 中央助教 | From: [140.115.218.163] | 發表日期 : 2013-03-16 18:03

測資第 42 行。

Input

11 0.091

Output

12

 
#7588: Re:WA line2 不知問題在哪


kkmomo (kkmomo)

學校 : 不指定學校
編號 : 29247
來源 : [223.137.94.20]
最後登入時間 :
2024-06-28 12:05:12
a646. 小民買糖果 -- 中央助教 | From: [111.249.92.66] | 發表日期 : 2013-03-16 18:13

測資第 42 行。

Input

11 0.091

Output

12

感謝您的回覆

最後我把有用到除法及小數的運算,盡量轉成只有整數的+-*去計算以減少誤差就沒問題了
雖然還是不懂問題出在哪裡><

 
ZeroJudge Forum