2 条题解
-
2
using namespace std; long long n,_1,_2,_3,_4,mi=LONG_MAX; int main(){ // freopen("jie.in","r",stdin); // freopen("jie.out","w",stdout); cin>>n; for(long long a=1;a<=n;++a){ long long b=(n-a*3)/4; long long c=a+b; long long d=c+b; if(abs(a+b+c+d-n)<mi&&a<b){ mi=abs(a+b+c+d-n); _1=a; _2=b; _3=c; _4=d; if(mi==0){ cout<<_1<<" "<<_2<<" "<<_3<<" "<<_4; return 0; } } }cout<<_1<<" "<<_2<<" "<<_3<<" "<<_4; }
-
1
其实可以很容易推出:
然后就可以写出一个暴力枚举的On2代码:
// O(n^2) 暴力枚举 #include <bits/stdc++.h> #define int long long using namespace std; int n; int a, b; signed main() { freopen("jie.in", "r", stdin); freopen("jie.out", "w", stdout); ios::sync_with_stdio(false); cin.tie(0); cin >> n; a = 1, b = 2; for (int i = 1; i <= n; i++) for (int j = i + 1; j <= n; j++) if (abs(n - 3 * i - 4 * j) < abs(n - 3 * a - 4 * b)) a = i, b = j; cout << a << " " << b << " " << a + b << " " << a + 2 * b << "\n"; return 0; }
30分到手了
一种是修改上面的代码套一层 for 循环枚举 的结果,容易发现 必然是 中的一个,此时就可以写出来 的代码了, 然后进一步如果能推出 b 是大于 a 且最接近,就能 做了
- 1
信息
- ID
- 1051
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 38
- 已通过
- 4
- 上传者