csp提高级的第19题补全程序,把正确答案填到程序里后是这个:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int n, B, w[maxn], v[maxn];
int gcd(int u, int v) {
if (v == 0)
return u;
return gcd(v, u % v);
}
void print(int w, int v) {
int d = gcd(w, v);
w = w / d;
v = v / d;
if (v == 1)
printf("%d\n", w);
else
printf("%d/%d\n", w, v);
}
void swap(int &x, int &y) {
int t = x; x = y; y = t;
}
int main() {
cin>>n>>B;
for (int i = 1; i <= n; i ++) {
scanf("%d %d", &w[i], &v[i]);
}
for (int i = 1; i < n; i ++)
for (int j = 1; j < n; j ++)
if (w[j] * v[j+1] < w[j+1] * v[j]) {
swap(w[j], w[j + 1]);
swap(v[j], v[j + 1]);
}
int curV, curW;
if (v[1] <= B) {
curV = v[1]; curW = w[1];
} else {
print(B * w[1] , v[1]);
return 0;
}
for (int i = 2; i <= n; i ++)
if (curV + v[i] <= B) {
curV += v[i];
curW += w[i];
} else {
print (curW * v[i] + (B - curV) * w[i], v[i]);
return 0;
}
print(curW, 1);
return 0;
}
然后输入样例:
3 8
4 4 2
5 3 2
结果输出的是39/5,而并非是正确答案中的42/5