开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
A.题
- 中文大意
纳西达爬山花费一点体力可以爬a米跳一下需要花费b点体力可以爬c米如果在最后体力不足b时我们也可以跳一次,我们现在有S点体力
- 解法
类似贪心大概有四种情况1。全部都是爬2.前S-1的体力都用来爬最后一个用来跳3.全是跳4.先跳后爬
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
typedef pair<int,int> PII;
void solve() {
ll a, b, c, S; scanf("%lld%lld%lld%lld", &a, &b, &c, &S);
ll res = a * S;
if(a * b >= c) {
res = max(a * (S - 1) + c, res);
}else {
int k = S / b;
S -= k * b;
if(S) {
res = max({res, c * k + c + (S - 1) * a, c * k + S * a});
} else {
res = max(res, c * k);
k --;
S = b;
res = max({res, c * k + c + (S - 1) * a, c * k + S * a});
}
}
printf("%lld", res);
}
int main() {
int T = 1;
// scanf("%d", &T);
while(T--) solve();
}
B题交互
- 中文大意
有一个分数并且我们最多有20次猜测的机会,每次会告诉我们是大了还是小了如果相等的话程序结束
- 解法
我们发现p,q的范围不超过1000那我们可以提前处理出所有gcd为1的情况,然后我们对所有求出的分数式子进行排序,然后模拟一下二分的操作就行了
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
typedef pair<int,int> PII;
PII a[1000010];
int tot;
void solve() {
for(int i = 1; i <= 1000; i++)
for(int j = 1; j <= 1000; j++) {
if(__gcd(i, j) == 1) {
a[++tot] = {i, j};
}
}
sort(a + 1,a + 1 + tot,[](PII a, PII b){
return a.first * b.second < b.first * a.second;
});
int l = 1, r = tot;
while(l <= r) {
int mid = l + r >> 1;
cout << "compare" << ' ' << a[mid].first << ' ' << a[mid].second << endl;
char op; scanf("%c", &op); getchar();
if(op == '>') r = mid - 1;
else if(op == '<') l = mid + 1;
else break;
}
}
int main() {
int T = 1;
// scanf("%d", &T);
while(T--) solve();
}