2025乔斯复赛集训十连测-(第十场)
已结束
IOI
开始于: 2025-10-29 1:15
120
小时
主持人:
68
2025乔斯复赛集训十连测-(第十场)
参考标程
A
#include<bits/stdc++.h>
using namespace std;
int a[11];
int main() {
freopen("money.in", "r", stdin);
freopen("money.out", "w", stdout);
for (int i = 1; i <= 9; i++) cin >> a[i];
a[0] = 1, a[10] = 10000;
double mx = 0;
int year = 0;
for (int i = 1; i <= 10; i++) {
if (a[i] / a[i - 1] > mx) {
mx = a[i] / a[i - 1];
year = i;
}
}
cout << year;
return 0;
}
B
#include <bits/stdc++.h>
using namespace std;
map<char, int> mp;
struct Node {
char c;
int num;
};
bool cmp(Node x, Node y) {
if (x.num != y.num) return x.num > y.num;
return x.c < y.c;
}
int main() {
freopen("title.in", "r", stdin);
freopen("title.out", "w", stdout);
string s;
getline(cin, s);
for (int i = 0; i < s.size(); i++) { //统计每个字符的出现次数
if(s[i] != ' ') mp[s[i]]++;
}
vector<Node> a;
for (auto x : mp) { //遍历 map 中的每个元素
a.push_back((Node){x.first, x.second});
}
sort (a.begin(), a.end(), cmp);
for (auto x : a) cout << x.c;
return 0;
}
C
#include <bits/stdc++.h>
using namespace std;
int T, M, a, b, c, fenzi, fenmu;
void yuefen() { //分子,分母约分
bool f = (fenzi < 0 ? 1 : 0);
if (f) fenzi *= -1; //先变成正数,然后进行约分
int k = __gcd(fenzi, fenmu);
fenzi /= k, fenmu /= k;
if (f) fenzi *= -1;
}
int k, t;
void calcu(int n) { //算出 k*sqrt(w)
for (int i = sqrt(n); i >= 1; i--) {
int w = n / i / i;
if (w * i * i == n) {
k = i, t = w;
return;
}
}
}
int main() {
freopen("uqe.in", "r", stdin);
freopen("uqe.out", "w", stdout);
cin >> T >> M;
while (T--) {
cin >> a >> b >> c;
int delta = b * b - 4 * a * c;
if (delta < 0) { cout << "NO\n"; continue; } //不存在
if (a < 0) a = -a, b = -b, c = -c;
int sq = sqrt(delta);
if (sq * sq == delta) { //如果 delta 能够开平方根
fenzi = -b + sq, fenmu = 2 * a;
yuefen();
if (fenmu == 1) printf("%d\n", fenzi);
else printf("%d/%d\n", fenzi, fenmu);
}
else { //如果 delta 不能开平方根
fenzi = -b, fenmu = a * 2;
yuefen();
if (b != 0) { //输出前半部分
if (fenmu == 1) printf("%d", fenzi);
else printf("%d/%d", fenzi, fenmu);
printf("+");
}
calcu(delta); //计算后半部分
fenzi = k, fenmu = a * 2;
yuefen();
if (fenzi == 1 && fenmu == 1) printf("sqrt(%d)", t);
else if (fenzi == 1) printf("sqrt(%d)/%d", t, fenmu);
else if (fenmu == 1) printf("%d*sqrt(%d)", fenzi, t);
else printf("%d*sqrt(%d)/%d", fenzi, t, fenmu);
printf("\n");
}
}
return 0;
}
D
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f
const int N = 1e4 + 5;
int n, m, k, vis[N][105];
struct Edge { int v, w; };
vector<Edge> G[N];
struct Node {
int x, t;
bool operator < (const Node &b) const {
return t > b.t;
}
}d[N][105]; //d[i][j]表示 起点到 i 点的时间 %k 的值为 j 的最短消耗时间
void Dij(int st) {
for (int i = 1; i <= n; i++) //初始化,将所有点到起点的距离初始化成无穷大
for (int j = 0; j < k; j++)
d[i][j].x = i, d[i][j].t = inf;
priority_queue<Node> q;
d[st][0].t = 0;
q.push(d[st][0]); //放入起点
while (q.size()) {
int u = q.top().x, t = q.top().t;
q.pop();
if (vis[u][t % k]) continue;
vis[u][t % k] = 1;
for (auto e : G[u]) { //枚举 u 的所有出边
int v = e.v, w = e.w, nt;
if (t >= w) nt = t; //如果当前的时刻能够直接通过这条路
else nt = ceil((w - t) * 1.0 / k) * k + t; //如果不能通过,我们需要通过推迟起点的出发时间达到通过这条路
if (d[v][(nt + 1) % k].t > nt + 1) {
d[v][(nt + 1) % k].t = nt + 1;
q.push((Node){v, nt + 1});
}
}
}
}
signed main() {
freopen("bus.in", "r", stdin);
freopen("bus.out", "w", stdout);
cin >> n >> m >> k;
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
G[u].push_back((Edge){v, w});
}
Dij(1);
cout << (vis[n][0] ? d[n][0].t : -1);
return 0;
}
- 状态
- 已结束
- 规则
- IOI
- 题目
- 4
- 开始于
- 2025-10-29 1:15
- 结束于
- 2025-11-3 1:15
- 持续时间
- 120 小时
- 主持人
- 参赛人数
- 68