2022ICPC杭州站网络赛A, B

170 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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题交互

  • 中文大意

有一个分数p/qp/q并且gcd(p,q)=1gcd(p,q) = 1我们最多有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();
}