江苏电信代码题题解
1、简单做的是节日礼物
简单模拟即可,代码如下 100%
#include <bits/stdc++.h> using namespace std; int main(){ string s; vector<int> v; while(cin >> s){ auto n = stoi(s); v.push_back(n); char c = cin.get(); if (c == '\n') { break; } } int mn = 1e9; for(int i = 0;i < v.size(); i++){ int sum = 0; for(int j = 0;j < v.size(); j++){ if(v[j] >= v[i]) sum += v[j] - v[i]; else sum += v[j]; } mn = min(mn,sum); } cout << mn << endl; return 0; }
2、中等做的是bug题 100%
dfs即可
代码如下:
#include <iostream> using namespace std; void dfs(int n,int t,int &mn){ if(t > mn) return; if(n == 1){ mn = min(mn,t + 1); return; } if(n) dfs(n - 1,t + 1,mn); if(n%2 == 0) dfs(n/2,t + 1,mn); if(n%3 == 0) dfs(n/3,t + 1,mn); } int main() { int n; cin >> n; int mn = 1e9; dfs(n,0,mn); cout << mn << endl; return 0; }
3、难题做的是求方案数量 全部通过得分0%
使用了位运算:
感觉这题提交有bug,不管提交什么都是用例通过,得分0%,按理说复杂度有点高也只是超时。
代码如下:
#include <bits/stdc++.h> using namespace std; int main() { int n,m,l; cin >> n >> m >> l; vector<int> g(l),p(l); for(int i = 0;i < l; i++) scanf("%d",&g[i]); for(int i = 0;i < l; i++) scanf("%d",&p[i]); int a = pow(2,l),res = 0; for(int i = 1; i < a; i++) { int now = 0,x = 0; for(int j = 0;j < l; j++) if(i >> j & 1) x += g[j],now += p[j]; if(x <= n && now >= m) { res++; } } cout << res << endl; return 0; }