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;
}