A. Three swimmers
问题简要描述:
三个人在泳池游一个来回分别需要的时间为a,b,c;
在时间p时到泳池的出发点,至少等多久一个人游到出发点。
输入输出:
直接计算,代码如下:
#include<iostream>
using namespace std;
long long min(long long a, long long b, long long c) {
long long r = a;
if (b < r) r = b;
if (c < r) r = c;
return r;
}
int main() {
int n;
cin >> n;
long long p, a, b, c, ar, br, cr, res;
for (int i = 0; i < n; ++i) {
cin >> p >> a >> b >> c;
if (p % a == 0 || p % b == 0 || p % c == 0) {
cout << 0 << endl;
continue;
}
ar = (p / a + 1) * a - p;
br = (p / b + 1) * b - p;
cr = (p / c + 1) * c - p;
res = min(ar, br, cr);
cout << res << endl;
}
}
贴一个大佬的题解学习:
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve() {
int a, b, c, p;
cin >> p >> a >> b >> c;
cout << min({(a - p % a) % a, (b - p % b) % b, (c - p % c) % c}) << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int q = 1;
cin >> q;
while (q--)
solve();
return 0;
}
Card Deck
问题简要描述:
一叠卡片,n张,每张值在1到p,想要重新排序,使得表达式的值最大
i的顺序由堆底到堆顶。
每次步骤,从牌顶取k张卡片,放到另一堆中(初始为空堆),直到原来的牌堆为空。输出最大排法。输入输出如下:
没做出来,贴上大神代码
#ifdef DEBUG
#define _GLIBCXX_DEBUG
#endif
//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
typedef long double ld;
typedef long long ll;
const int maxN = 1e5 + 10;
int p[maxN];
int n;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
// freopen("input.txt", "r", stdin);
int tst;
cin >> tst;
while (tst--) {
vector<int> ps;
int mx = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i];
mx = max(mx, p[i]);
if (mx == p[i]) {
ps.emplace_back(i);
}
}
ps.emplace_back(n + 1);
for (int i = ps.size() - 2; i >= 0; i--) {
int from = ps[i];
int to = ps[i + 1] - 1;
for (int x = from; x <= to; x++) cout << p[x] << " ";
}
cout << '\n';
}
return 0;
}