Problem:
会津地鶏
2008 年 4 月に、会津若松市は長さ20 m 85 cm のやきとり作りに挑戦して成功しました。このとき使われた鶏肉が、会津特産の会津地鶏です。会津地鶏はとてもおいしいのですが、飼育がむずかしいので生産量が少なく、値段が高いのが難点です。
今日は一郎君の家に、遠くから親戚が遊びに来ます。お母さんは鶏肉の水炊きを作って親戚をもてなすことにしました。近くのお肉屋さんでは会津地鶏とふつうの鶏肉の 2 種類の鶏肉を売っています。お母さんは、以下のような指示を一郎君に与えて、お肉屋さんに行って鶏肉を買ってくるように
頼みました。
鶏肉が足りなくなると困るので、決められた量以上の鶏肉を買う。
予算の許す範囲で会津地鶏をできるだけ多く買う(会津地鶏は必ず買うこと)。
会津地鶏を買った残りでふつうの鶏肉をできるだけ多く買う(予算が足りなければ買わない)。
一郎君がお肉屋さんに行くと、会津地鶏が品薄のため一人が買える量を制限していました。一郎君が、お母さんから与えられたすべての指示を守って買い物をするとき、一郎君が買う会津地鶏と普通の鶏肉の量はそれぞれ何グラムになるでしょう?
買うべき鶏肉の量の下限
q
1
、予算
b
、このお肉屋さんでの会津地鶏 100 グラムの値段
c
1
、ふつうの鶏肉 100 グラムの値段
c
2
、会津地鶏を一人が買える量の上限
q
2
を入力とし、一郎君が買う会津地鶏とふつうの鶏肉の量を 100 グラム単位で出力するプログラムを作成してください。ただし、このお肉屋さんではお母さんの指示通りに買えない場合には、「NA」と出力してください。
Input
複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。 各データセットは以下の形式で与えられます。
q
1
b
c
1
c
2
q
2
鶏肉の量を表すデータ
q
1
と
q
2
は100 グラム単位で指定されます。また、
b
、
c
1
、
c
2
、
q
1
、
q
2
は 1 以上 1,000,000 以下の整数とします。
データセットの数は 50 を超えません。
Output
データセット毎に、一郎君が購入する会津地鶏の量とふつうの鶏肉の量(半角空白区切り) または「NA」を１行に出力します。
Sample Input
48 9297 240 126 32
20 3010 157 141 7
30 117002 5680 962 15
8 1673 1712 190 22
64 8478 87 54 307
23 5477 117 92 12
50 7558 1396 187 17
279 88677 4522 514 14
0
Output for the Sample Input
28 20
7 13
15 33
NA
97 0
12 44
NA
NA

Submitted solutions:

code_snippet: #include <iostream>
using namespace std;

int main()
{
	int q1, b, c1, c2, q2, x, y;

	cin >> q1;

	while (q1) {
		cin >> b >> c1 >> c2 >> q2;

		x = q2;

		while (c1 * x + c2 * (q1 - x) > b || c1 * x > b)
			x--;

		if (x <= 0)
			cout << "NA" << endl;
		else {
			y = q1 - x;

			while (c1 * x + c2 * y < b)
				y++;

			if (c1 * x + c2 * y > b)
				y--;

			cout << x << " " << y << endl;
		}

		cin >> q1;
	}

	return 0;
}
accuracy: 1
time_ms: 150
memory_kb: 3088
final_rank: 5

code_snippet: #include <iostream>
#include <complex>
#include <sstream>
#include <string>
#include <algorithm>
#include <deque>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <vector>
#include <set>
#include <limits>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;
#define REP(i, j) for(int i = 0; i < (int)(j); ++i)
#define FOR(i, j, k) for(int i = (int)(j); i < (int)(k); ++i)
#define SORT(v) sort((v).begin(), (v).end())
#define REVERSE(v) reverse((v).begin(), (v).end())
typedef complex<double> P;
const int INF = 1e9 + 7;

int q1, b, q2;
double c1, c2;

int check(int x){
  if(x < 0 || x > q2) return -1;
  double p = (x / 100) * c1;
  if(p > b) return -1;
  int y = (b - p) / c2;
  y *= 100;
  if(x + y < q1) return -1;
  return y;
}
 
int main() {
  while(cin >>q1 && q1){
    cin >>b >>c1 >>c2 >>q2;
    q1 *= 100; q2 *= 100;
    int x = -1, y = -1, tmp;
    for(int i = 10000000; i >= 100; i -= 100) if((tmp = check(i)) != -1) { x = i; y = tmp; break; }
    if(x == -1) cout <<"NA" <<endl;
    else cout <<x / 100 <<" " <<y / 100 <<endl;
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1228
final_rank: 2

code_snippet: #include<iostream>
using namespace std;

int main()
{
  int q1,b,c1,c2,q2;
  for(;cin>>q1,q1;)
    {
      cin>>b>>c1>>c2>>q2;
      int ans1=-1,ans2;
      for(int i=1;i<=q2;i++)
	{
	  int money=b;
	  money-=i*c1;
	  if((money/c2)+i>=q1 && money>=0)
	    {
	      ans1=i;
	      ans2=money/c2;
	    }
	}
      if(ans1==-1)
	cout<<"NA"<<endl;
      else
	cout<<ans1<<" "<<ans2<<endl;
    }
}
accuracy: 1
time_ms: 10
memory_kb: 1160
final_rank: 1

code_snippet: #define _USE_MATH_DEFINES
#define INF 10000000
#include <iostream>
#include <sstream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>

using namespace std;

typedef long long ll;
typedef pair<int,string> P;

static const double eps = 1e-8;

int main(){
	int q1;
	while(~scanf("%d",&q1)){
		if(q1==0) break;
		int b,c1,c2,q2;
		//1:aize chiken 2:normal chiken
		scanf("%d %d %d %d",&b,&c1,&c2,&q2);
		for(int i=q2;i>=1;i--){
			int cost = i*c1;

			int ub = 1000000;
			int lb = 0;

			for(int j=0;j<20;j++){
				int md = (ub+lb)/2;
				if(cost + md*c2 <=b) lb = md;
				else ub = md;
			}

			if(lb+i >= q1 && cost + lb*c2 <=b){
				printf("%d %d\n",i,lb);
				goto next;
			}
		}
		printf("NA\n");
next:;
	}
}
accuracy: 1
time_ms: 50
memory_kb: 880
final_rank: 3

code_snippet: #define _USE_MATH_DEFINES
#define INF 10000000
#include <iostream>
#include <sstream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>

using namespace std;

typedef long long ll;
typedef pair<int,string> P;

static const double eps = 1e-8;

int main(){
	int q1;
	while(~scanf("%d",&q1)){
		if(q1==0) break;
		int b,c1,c2,q2;
		//1:aize chiken 2:normal chiken
		scanf("%d %d %d %d",&b,&c1,&c2,&q2);
		for(int i=q2;i>=1;i--){
			int cost = i*c1;

			int ub = 1000000;
			int lb = 0;

			for(int j=0;j<50;j++){
				int md = (ub+lb)/2;
				if(cost + md*c2 <=b) lb = md;
				else ub = md;
			}

			if(lb+i >= q1 && cost + lb*c2 <=b){
				printf("%d %d\n",i,lb);
				goto next;
			}
		}
		printf("NA\n");
next:;
	}
}
accuracy: 1
time_ms: 130
memory_kb: 880
final_rank: 4