#include /* 2014年ACMプログラミングコンテストA問題 解き方:  (1)元の税率での税込み価格を2分割して、  (2)それぞれの値が、その税率で存在できるか調べ、  (3)元の税率で割って小数点切り上げして原価を求める。  (4)原価に後の税率をかけて足し算する。 存在しない税込価格があることがポイントだと思って、それを求める関数(available)を作成したのですが、たぶんこの方法よりも、元の税込み価格 / 税率を切り上げして原価を求めて、同じ税率をかけて切り下げして元の税込み価格に戻せない場合は、その税込み価格は存在できないとしても良かったと思います。 また、原価を求めるときに「切り上げ」をすればよい、というのは「勘」でやっていて合っていることを完全に確かめていません。 2014年7月12日 中田 */ // 切り上げの割り算 int ceil_divide(int v1,int v2) { return v1/v2 + (v1%v2==0?0:1); } // 第一引数のvalueという数値が、第二引数で表される税率で存在できる税込み価格であるかを判定する。 // xはパーセント表記である。例えば税率が5%の場合は、x==5となる。 // 存在しない税込み価格は、以下の式で求められる。 // not_value = (100*a)/x + (a-1) [a=1,2,3...] // このaを順番に調べていって、今調べたい数値と一致したら存在できない、今調べている数値を越した場合には、その数値は存在できると判定している。 int available(int value,int x) { for(int cnt=100;;cnt+=100){ int not_value = ceil_divide(cnt,x)+cnt/100-1; if(not_value > value){ return 1; }else if(not_value == value){ return 0; } } } int main() { for(;;){ // 元の税率x, 後の税率y, 元の税率での2つの商品の税込み価格の和s int x,y,s; scanf("%d %d %d",&x,&y,&s); if(x == 0){ break; } // 後の税込み価格の和を入れる変数 int max = 0; // 元の税込み価格を2つに分割して総当たりする。 for(int s1=1;s1<=s/2;s1++){ int s2 = s-s1; // 元の税率で存在できる値である場合のみをチェックする。 if(1==available(s1,x) && 1==available(s2,x)){ int g1 = ceil_divide(s1*100,100+x); int g2 = ceil_divide(s2*100,100+x); int a1 = g1*(100+y)/100; int a2 = g2*(100+y)/100; if(a1+a2 > max){ max = a1+a2; } } } printf("%d\n",max); } }