今天不适合刷题。。。
题意:一个桌子4条腿,每条腿由一种硬币构成,四条腿必须一样长,请问如何最接近给出的标准桌子高度,输出两个最接近的值。
更新两个值的时候错误的判断如果lcm大于h就不再更新了,却没有想到高于h的部分依然可以更新,只是不能更新小于h的部分了。
#include <iostream> #include <cstdio> #include <cstring> #include <set> #include <vector> #include <map> #include <algorithm> #include <queue> #include <cmath> #include <bitset> using namespace std; // 大数,内存处理 #define INF 0x3f3f3f3f #define ll long long int #define MEM(a) memset(a, 0, sizeof(a)) #define MEMM(a) memset(a, -1, sizeof(a)) #define DEB(x, n) cout << (x) << " " << (n) << endl #define FOR(i, s, e) for(int (i) = (s); (i) < (e); (i)++) const double PI = acos(-1.0); #define CR printf("\n") // 调试用 template <class Type> void debug(Type a[], int len) { for(int i = ; i < len ; i++) { cout << a[i] << " "; } cout << endl; } int gcd(int a, int b) { return b == ? a: gcd(b, a % b); } const int maxn = 50 + 10; int a[maxn]; int n, t; int table[15]; int ans1[15]; int ans2[15]; void output() { for(int i = ; i < t; i++) printf("%d %d\n", ans1[i], ans2[i]); } // 寻找边界 bool findmax(int lcm, int num, int &mint, int &maxt) { // if(lcm > num) // return false; int t = num / lcm * lcm; if(t == num) { mint = num; maxt = num; } else { mint = t; maxt = t + lcm; } // return 1; } // 检查 void check(int lcm) { int mint, maxt; for(int i = ; i < t; i++) { findmax(lcm, table[i], mint, maxt); if(ans1[i] == -1 || mint > ans1[i]) ans1[i] = mint; if(ans2[i] == -1 || maxt < ans2[i]) ans2[i] = maxt; } } // 枚举四个腿 void fs(int c, int num, int lcm) { if(num == 4) { check(lcm); return; } for(int i = c; i < n; i++) { int temp = lcm; lcm = lcm / gcd(lcm, a[i]) * a[i]; // 可能溢出 fs(i+1, num+1, lcm); lcm = temp; } } int main() { #ifdef DEBUG freopen("input", "r", stdin); //从input文件中读入 // freopen("output", "w", stdout); //输出到output文件 #endif while(~scanf("%d%d", &n, &t) && n != ) { for(int i = ; i< n; i++) scanf("%d", &a[i]); for(int i = ; i < t; i++) { scanf("%d", &table[i]); ans1[i] = -1; ans2[i] = -1; } fs(, , 1); output(); } return ; }