本篇题解只是记录我的做题过程代码,不提供最优解
A点击此处查看对应的题目.
本题涉及算法:贪心
本题听说有有更简单的解法,我这里说说我这不入流的解法:通过贪心选取答案,并外加一个特判(有两个最大值的情况)。
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
#includeusing namespace std; const int N = 1e5 + 10,INF = 1e9 + 1; typedef long long ll; ll a[N],t[N]; void solve() { vector v; for(int i = 0;i < 3; i ++) { cin >> a[i]; t[i] = a[i]; } sort(t,t + 3); ll maxn = t[2]; if(t[2] == t[1]) { if(a[1] == a[0]){ v.push_back(1),v.push_back(1),v.push_back(maxn - a[2] +1); } else if(a[1] == a[2]){ v.push_back(maxn - a[0] +1),v.push_back(1),v.push_back(1); }else{ v.push_back(1),v.push_back(maxn - a[1] +1),v.push_back(1); } } else if(a[0] == a[1] && a[1] == a[2]){ for(int i = 0;i < 3;i ++) v.push_back(maxn + 1); }else { for(int i = 0;i < 3;i ++) { if(a[i] == maxn) v.push_back(0); else v.push_back(maxn - a[i] +1); } } for(int i = 0;i < 3;i ++) cout << v[i] <<" "; puts(""); } int main() { int t; cin >> t; while(t --){ solve(); } return 0; }
B
点击此处查看对应的题目.
本题设计算法:贪心 + 模拟
直接双循环匹配两个点,直到找到最小值
我原本还想的太复杂了,竟然还去模拟各种情况,后来发现可以直接暴力,反正数据也很小。
时间复杂度
O
(
n
2
)
O(n^2)
O(n2)
#includeusing namespace std; typedef long long ll; const int N = 1e5 + 10,INF = 1e9; int a[N],x[N]; void solve() { string s; cin >> s; int res = INF,n = s.size(); for(int i = 0;i < n;i ++){ for(int j = i + 1;j < n;j ++){ if(((s[i] - '0') * 10 + (s[j] - '0')) % 25 == 0){ res = min(res,n - i - 2); } } } cout << res << 'n'; } int main() { int t; cin >> t; while(t -- ){ solve(); } return 0; }
C
点击此处查看对应的题目.
本题设计算法:贪心
通过维护一个表示老鼠离洞口的距离的前缀数组,然后排序,贪心的从小到大处理,看有几个老鼠逃出升天。
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
#includeusing namespace std; typedef long long ll; const int N = 4e5 + 10,INF = 1e9; int locate[N],pre[N]; void solve() { int n,k; cin >> n >> k; for(int i = 0;i < k;i ++) cin >> locate[i]; for(int i = 0;i < k;i ++){ pre[i] = n - locate[i]; } sort(pre,pre + k); int sum = 0,cnt = 0; for(int i = 0;i < k;i ++){ sum += pre[i]; if(sum >= n) break; cnt ++; } cout << cnt << 'n'; } int main() { int t; cin >> t; while(t -- ){ solve(); } return 0; }
D1
点击此处查看对应的题目.
本题涉及算法:贪心
对于本题,我们可以从小到大记录所有的差值,由题意得,我们可以随便将一个差值带入循环中,暴力的枚举所有可能的答案,最后判断是否所有差值都可被整除,找到答案。
时间复杂度 O ( n 2 ) O(n^2) O(n2)
#includeusing namespace std; typedef long long ll; const int N = 4e5 + 10,INF = 1e9; ll a[N]; void solve() { int n; cin >> n; vector sub; for(int i = 0;i < n;i ++) cin >> a[i]; sort(a, a + n); ll sub_max = a[n - 1] - a[0]; for(int i = 1;i < n;i ++ ) if(a[i] != a[i - 1]) sub.push_back(a[i] - a[i - 1]); if(sub.empty()) sub.push_back(0);//这里一定要注意特判,否则会RE bool st = true;ll res = -1; for(int i = 1;i <= sub[0];i ++){ st = true; for(int j = 0;j < sub.size();j ++){ if(sub[j] % i != 0) { st = false; break; } } if(st) res = i; } cout << res << 'n'; } int main() { int t; cin >> t; while(t -- ){ solve(); } return 0; }



