蓝桥杯 貌似化学 数学问题

问题描述
  现在有a,b,c三种原料,如果他们按x:y:z混合,就能产生一种神奇的物品d。
  当然不一定只产生一份d,但a,b,c的最简比一定是x:y:z
  现在给你3种可供选择的物品:
  每个物品都是由a,b,c以一定比例组合成的,求出最少的物品数,使得他们能凑出整数个d物品(这里的最少是指三者个数的总和最少)
输入格式
  第一行三个整数,表示d的配比(x,y,z)
  接下来三行,表示三种物品的配比,每行三个整数(<=10000)。
输出格式
  四个整数,分别表示在最少物品总数的前提下a,b,c,d的个数(d是由a,b,c配得的)
  目标答案<=10000
  如果不存在满足条件的方案,输出NONE
样例输入
3 4 5
1 2 3
3 7 1
2 1 2
样例输出
8 1 5 7
看到这道题的标签是g背包,以为是dp背包问题,然后开始想背包问题有01背包,完全背包,多重背包,混合背包。g背包是啥QAQ
 

看了大佬的题解才知道完全是数学问题,参考自https://blog.csdn.net/starlet_kiss/article/details/87077918

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll g[4][4];
 5 ll gcd(ll x, ll y) {
 6     if (y == 0) {
 7         return x;
 8     } else {
 9         return gcd(y, x % y);
10     }
11 }
12 int main() {
13     ll a, b, c;
14     cin >> a >> b >> c;
15     for (int i = 1; i <= 3; i++) {
16         for (int j = 1; j <= 3; j++) {
17             cin >> g[i][j];
18         }
19     }
20     ll A = a * g[1][2] - b * g[1][1]; ll B = a * g[2][2] - b * g[2][1]; ll C = a * g[3][2] - b * g[3][1];
21     ll D = b * g[1][3] - c * g[1][2]; ll E = b * g[2][3] - c * g[2][2]; ll F = b * g[3][3] - c * g[3][2];    
22     ll x = -B * F + C * E; ll y = -D * C + A * F; ll z = -A * E + B * D;
23     if (x < 0) {
24         x = -x;
25         y = -y;
26         z = -z;
27     }
28     if (x < 0 || y < 0 || z < 0) {
29         cout << "NONE" << endl;
30         return 0;
31     }
32     ll t = gcd(x, y);
33     t = gcd(t, z);
34     cout << x / t << " " << y / t << " " << z / t << " " << (x * g[1][1] + y * g[2][1] + z * g[3][1]) / (a * t) << endl;
35     return 0;
36 }

猜你喜欢

转载自www.cnblogs.com/fx1998/p/12672042.html
今日推荐