本文主要是介绍传智杯第五届题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
B.莲子的机械动力学
分析:这题有个小坑,如果是0+0 = 0,结果记得要输出0。
得到的教训是,避免前导0出现时,要注意答案为0的情况。否则有可能会没有输出
#include<assert.h>
#include<cstdio>
#include<set>
#include<list>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include <stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<sstream>
#include<stack>
#include <utility>
#include<map>
#include <vector>#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
//2147483647#define int long long
//#include <bits/stdc++.h>
typedef long long ll;
#include<iostream>
using namespace std;const int N = 1e6 + 10;
long long MAX(long long a, long long b) { return a < b ? b : a; }
long long MIN(long long a, long long b) { return a < b ? a : b; }
int qmi(int a, int k, int p) {int res = 1;while (k) {//后面的a其实是底数与其指数的运算结果了,是不断迭代的//第一个a其实就是a的2的0次方if (k & 1) res = (res * a) % p;a = (a * a) % p;//注意,a是一个不断变化的过程//下一个a就等于上一个a的平方,k >>= 1;}return res;
}
int C(int a, int b,int p) {int ans = 1;int j = a;for (int i = 1; i <= b; i++,j--) {ans = ans * j % p;ans = ans * qmi(i, p - 2, p) % p;}return ans;
}
int lucas(int a, int b,int p) {if (a < p && b < p) {return C(a, b, p);}return C(a % p, b % p, p) * lucas(a / p, b / p, p) % p;}//16:33
int a[N], b[N], c[N];
signed main() {int n, m; cin >> n >> m;for (int i = n; i >= 1; i--) cin >> a[i];for (int i = m; i >= 1; i--) cin >> b[i];//想要a存的是位数比较多的数if (n < m) {swap(a, b);swap(n, m);}for (int i = 1; i <= n; i++) {c[i] += a[i] + b[i];int k = i + 1;int add = c[i] / k;c[i] %= k;c[i + 1] += add;}int f = 0;bool isPrint = false;for (int i = N; i >= 1; i--) {if (c[i] != 0) f = 1;if (f) {if (i != 1) cout << c[i] << " ";else cout << c[i];isPrint = true;}}if (!isPrint) cout << 0;return 0;
}
C-莲子的排版设计学
分析:关键是对于行号的处理,要打印多少空格
#include<cstdio>
#include<set>
#include<list>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include <stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<sstream>
#include<stack>
#include <utility>
#include<map>
#include <vector>#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
#define int long long
//#include <bits/stdc++.h>
typedef long long ll;
#include<iostream>
using namespace std;const int N = 1e4 + 10;
//long long MAX(long long a, long long b) { return a < b ? b : a; }vector<string> ans;
int num;
int j = 10;
void PrintBlank() {for (int i = 0; i < num; i++) cout << " ";
}
signed main() { //IOS;string s;int cnt = 0;while (getline(cin,s)) {ans.push_back(s);//getchar();}int n = ans.size();int k = 10;while (n>=0) {n -= k;k *= 10;if (n>=0) num++;}for (int i = 0; i < ans.size(); i++) {cnt++;if (i + 1 == j) {//进位了,就减少一次空格的打印num--;j *= 10;}PrintBlank();cout << cnt << " ";puts(ans[i].c_str());}return 0;
}
D-莲子的物理热力学
分析:
难想的点就在于,想不到可以假设一个[l,r]的区间,这个有点像二分的思想。
第二个难点在于,要想到操作次数是u+v+min(u,v)。但这个通过模拟样例,多少可以获得一点灵感。
教训:看到“极差”,这类字眼,就要想想看二分了。二分就是枚举假设mid是否成立。这题虽然不是二分,但思想和二分很像。
#include<assert.h>
#include<cstdio>
#include<set>
#include<list>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include <stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<sstream>
#include<stack>
#include <utility>
#include<map>
#include <vector>#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
#define int long long
//#include <bits/stdc++.h>
typedef long long ll;
#include<iostream>
using namespace std;const int N = 1e6 + 10;
//long long MAX(long long a, long long b) { return a < b ? b : a; }int a[N];
signed main() { //IOS;int n, m; cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> a[i];}sort(a + 1, a + 1 + n);int j = 1;int ans = 2147483647;for (int i = 1; i <= min(n, m + 1); i++) {j = max(j, i);while ((i - 1) + (n - j) + min(i - 1, n - j) > m) j++;ans = min(ans, a[j] - a[i]);}cout << ans;return 0;
}
这篇关于传智杯第五届题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!