#11063: 解題心得&解題邏輯


a5083 (assassin刺客大師)

學校 : 新北市立板橋高級中學
編號 : 28347
來源 : [140.116.138.99]
最後登入時間 :
2017-06-27 17:13:56
c093. 00608 - Counterfeit Dollar -- UVa608 | From: [140.123.56.238] | 發表日期 : 2016-06-16 21:16

我們可以建立一個陣列來儲存硬幣的狀態

假設 -1代表硬幣不確定  0代表硬幣必定正常  1代表硬幣可能過輕   2代表硬幣可能過重   3代表硬幣有極高的機率過輕  4代表硬幣有極高的機率過重

 

如果出現 even

代表天平兩端的硬幣都是正常的(天平兩端的硬幣狀態強制設為0,且不可再更改)

 

如果出現 up

代表天坪左端出現的硬幣可能過重,或右端出現的硬幣可能過輕

這時我們可以設置左端硬幣狀態

若左端硬幣狀態為-1時,就設為2

若左端硬幣狀態為0時,不能變動

若左端硬幣狀態為1時,就設為0 (因為一個硬幣前個狀態為可能過輕,下個狀態變為可能過重,代表他其實是正常的硬幣)

若左端硬幣狀態為2時,就設為4 (因為一個硬幣前個狀態為可能過重,下個狀態變仍為過重,代表他有很高的機率是過重的硬幣)

同理

若左端硬幣狀態為-1時,就設為1

若左端硬幣狀態為0時,不能變動

若左端硬幣狀態為1時,就設為3 (因為一個硬幣前個狀態為可能過輕,下個狀態變仍為過輕,代表他有很高的機率是過輕的硬幣)

若左端硬幣狀態為2時,就設為0 (因為一個硬幣前個狀態為可能過重,下個狀態變為可能過輕,代表他其實是正常的硬幣)

 

如果出現 down (做法與上方類似,只是要顛倒過來)

 

最後我們查看硬幣狀態陣列中是否有3或4    

如果有3的話必不會有4,有4的話必不會有3 (因為題目有唯一解)

假如有3,我們就說該硬幣過輕

 

如果硬幣狀態陣列中沒有3也沒有4,那就看有沒有1或2

如果有1的話必不會有2,有2的話必不會有1 (因為題目有唯一解)

假如有2,我們就說該硬幣過重

 

 
#12735: Re:解題心得&解題邏輯


clktease (unknown)

學校 : 國立中山大學
編號 : 66330
來源 : [118.232.108.196]
最後登入時間 :
2024-02-05 19:18:13
c093. 00608 - Counterfeit Dollar -- UVa608 | From: [140.117.183.68] | 發表日期 : 2017-09-22 11:52

 

}

照著上面解題方向打的只有把0跟1顛倒
不知道哪裡寫錯 一直卡在WA 7  

#0: 100% WA (line:7)

您的答案為: K is the counterfeit coin and it is light.
正確答案為: A is the counterfeit coin and it is light.

 

 
#12737: Re:解題心得&解題邏輯


clktease (unknown)

學校 : 國立中山大學
編號 : 66330
來源 : [118.232.108.196]
最後登入時間 :
2024-02-05 19:18:13
c093. 00608 - Counterfeit Dollar -- UVa608 | From: [140.117.183.68] | 發表日期 : 2017-09-22 11:55

 

}

照著上面解題方向打的只有把0跟1顛倒
不知道哪裡寫錯 一直卡在WA 7  

#0: 100% WA (line:7)

您的答案為: K is the counterfeit coin and it is light.
正確答案為: A is the counterfeit coin and it is light.

 

#include <iostream>

#include <string>

#include <cmath>

#include<string.h>

#include<map>

using namespace std;

 

 

int main()

{

  int n;

while(cin >> n)

{getchar();

 

while(n--)

{int f[12]={0};

 

for(int p=0;p<3;p++)

{string s;

int flag=0,flag1=0;

  getline (cin, s);

  for(int i=0;i<s.size();i++)

  {if(s[i]=='e')

  {flag=1;break;}

  if(s[i]=='u')

  {flag1=1;break;}

  if(s[i]=='d')

  break;

  }

 if(flag==1)

 {

for(int i=0;i<s.size();i++)

if(s[i]>='A'&&s[i]<='Z')

f[s[i]-'A']=-1;

}

if(flag1==1)

{int k;

for( k=0;s[k]!=' ';k++)

{  if(s[k]>='A'&&s[k]<='Z')

  {switch(f[s[k]-'A'])

  {case 0:

   f[s[k]-'A']=1;

   break;

   case 1:

    f[s[k]-'A']=3;

    break;

    case 2:

    f[s[k]-'A']=-1;

    break;

  }

  }

}

for(k=k+1;k!=' ';k++)

{if(s[k]>='A'&&s[k]<='Z')

  {switch(f[s[k]-'A'])

  {case 0:

   f[s[k]-'A']=2;

   break;

   case 2:

    f[s[k]-'A']=4;

    break;

    case 1:

    f[s[k]-'A']=-1;

    break;

  }

  }

}

        }

if(flag==0&&flag1==0)

{int o;

for(o=0;s[o]!=' ';o++)

{if(s[o]>='A'&&s[o]<='Z')

  {switch(f[s[o]-'A'])

  {case 0:

   f[s[o]-'A']=2;

   break;

   case 2:

    f[s[o]-'A']=4;

    break;

    case 1:

    f[s[o]-'A']=-1;

    break;

  }

  }

}

for( o=o+1;s[o]!=' ';o++)

{  if(s[o]>='A'&&s[o]<='Z')

  {switch(f[s[o]-'A'])

  {case 0:

   f[s[o]-'A']=1;

   break;

   case 1:

    f[s[o]-'A']=3;

    break;

    case 2:

    f[s[o]-'A']=-1;

    break;

  }

  }

  }

          }

}   

         

 int check=0;              

for(int i=0;i<12;i++)

{if(f[i]==3)

{check=1;

cout <<char(i+'A')<<" is the counterfeit coin and it is "<<"heavy."<<endl;}

 if(f[i]==4)

 {check=1;

cout <<char(i+'A')<<" is the counterfeit coin and it is "<<"light."<<endl;    

}

}

 

if(check==0)

for(int i=0;i<12;i++)

{if(f[i]==1)

 

cout <<char(i+'A')<<" is the counterfeit coin and it is "<<"heavy."<<endl;

 if(f[i]==2)

 cout <<char(i+'A')<<" is the counterfeit coin and it is "<<"light."<<endl;    

 

}

    

    

 

}

 

    

 

 

 

}

 

    return 0;

}



 
#29499: Re:解題心得&解題邏輯


s111010137@student.nqu.edu.tw (Khazix)

學校 : 國立金門大學
編號 : 177202
來源 : [1.172.139.67]
最後登入時間 :
2022-11-09 22:20:56
c093. 00608 - Counterfeit Dollar -- UVa608 | From: [39.10.198.133] | 發表日期 : 2022-03-06 22:40

我們可以建立一個陣列來儲存硬幣的狀態

假設 -1代表硬幣不確定  0代表硬幣必定正常  1代表硬幣可能過輕   2代表硬幣可能過重   3代表硬幣有極高的機率過輕  4代表硬幣有極高的機率過重

 

如果出現 even

代表天平兩端的硬幣都是正常的(天平兩端的硬幣狀態強制設為0,且不可再更改)

 

如果出現 up

代表天坪左端出現的硬幣可能過重,或右端出現的硬幣可能過輕

這時我們可以設置左端硬幣狀態

若左端硬幣狀態為-1時,就設為2

若左端硬幣狀態為0時,不能變動

若左端硬幣狀態為1時,就設為0 (因為一個硬幣前個狀態為可能過輕,下個狀態變為可能過重,代表他其實是正常的硬幣)

若左端硬幣狀態為2時,就設為4 (因為一個硬幣前個狀態為可能過重,下個狀態變仍為過重,代表他有很高的機率是過重的硬幣)

同理

若左端硬幣狀態為-1時,就設為1

若左端硬幣狀態為0時,不能變動

若左端硬幣狀態為1時,就設為3 (因為一個硬幣前個狀態為可能過輕,下個狀態變仍為過輕,代表他有很高的機率是過輕的硬幣)

若左端硬幣狀態為2時,就設為0 (因為一個硬幣前個狀態為可能過重,下個狀態變為可能過輕,代表他其實是正常的硬幣)

 

如果出現 down (做法與上方類似,只是要顛倒過來)

 

最後我們查看硬幣狀態陣列中是否有3或4    

如果有3的話必不會有4,有4的話必不會有3 (因為題目有唯一解)

假如有3,我們就說該硬幣過輕

 

如果硬幣狀態陣列中沒有3也沒有4,那就看有沒有1或2

如果有1的話必不會有2,有2的話必不會有1 (因為題目有唯一解)

假如有2,我們就說該硬幣過重

 


另外,還有可能左端是3 or 4 然後又被認為是 1 or 2 的情況

 
ZeroJudge Forum