2023百度之星摘记

发布时间 2023-08-12 15:16:35作者: Qiansui

百度之星合集链接

初赛一

1 公园

三遍 dij 求最短

//>>>Qiansui
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x, y, sizeof(x))
#define debug(x) cout << #x << " = " << x << '\n'
#define debug2(x,y) cout << #x << " = " << x << " " << #y << " = "<< y << '\n'
#define int long long

using namespace std;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pull;
typedef pair<double, double> pdd;
/*

*/
const int maxm = 4e4 + 5, mod = 998244353;
const ll inf = 1e10;
vector<int> e[maxm];
int te, fe, s, t, f, n, m;
vector<vector<ll>> dis;

void dij(int u, int c){
	dis[c][u] = 0;
	vector<bool> vis(n + 1, false);
	priority_queue<pii, vector<pii>, greater<pii>> q;
	for(auto v : e[u]){
		q.push({1, v});
	}
	while(!q.empty()){
		pii t = q.top(); q.pop();
		// debug2(t.first, t.second);
		if(vis[t.second]) continue;
		vis[t.second] = true;
		dis[c][t.second] = t.first;
		for(auto v : e[t.second]){
			if(!vis[v] && dis[c][v] > dis[c][t.second] + 1){
				q.push({dis[c][t.second] + 1, v});
			}
		}
	}
	return ;
}

void solve(){
	cin >> te >> fe >> s;
	cin >> t >> f >> n >> m;
	dis = vector<vector<ll>> (3, vector<ll> (n + 1, inf));
	for(int i = 0; i < m; ++ i){
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dij(t, 0);
	dij(f, 1);
	dij(n, 2);
	ll ans = inf;
	for(int i = 1; i <= n; ++ i){
		ans = min(ans, dis[0][i] * te + dis[1][i] * fe + dis[2][i] * (te + fe - s));
	}
	if(ans == inf) cout << "-1\n";
	else cout << ans << '\n';
	return ;
}

signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int _ = 1;
	// cin >> _;
	while(_ --){
		solve();
	}
	return 0;
}

5 糖果促销

先买 1 糖果,接下来每次买 p - 1 个糖果即可再换出一个糖果,如此循环,不足 p - 1 个时单买

//>>>Qiansui
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x, y, sizeof(x))
#define debug(x) cout << #x << " = " << x << '\n'
#define debug2(x,y) cout << #x << " = " << x << " " << #y << " = "<< y << '\n'
#define int long long

using namespace std;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pull;
typedef pair<double, double> pdd;
/*

*/
const int maxm = 2e5 + 5, inf = 0x3f3f3f3f, mod = 998244353;

void solve(){
	ll p, k;
	cin >> p >> k;
	if(k == 0){
		cout << "0\n";
		return ;
	}
	ll n = k / p, ans = 1;
	ll yu = k - n * p;
	if(yu) -- yu;
	ans = n * (p - 1) + yu + 1;
	cout << ans << '\n';
	return ;
}

signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int _ = 1;
	cin >> _;
	while(_ --){
		solve();
	}
	return 0;
}

8 除法游戏

nim游戏改版,本题的关键在于怎么快速求出每堆石子的 sg 值