0%

2025 United Kingdom and Ireland Programming Contest (UKIEPC 2025) 2025 英国 ICPC——G. Get Good

题目大意

题目总结:G. Get Good

基本参数

  • nn: 总天数。

  • aa: 处于“精力充沛”状态下每日获得的技能点。

  • bb: 处于“疲劳”状态下每日获得的技能点(aba \ge b)。

  • xx: 连续工作 xx 天后,状态从“精力充沛”转为“疲劳”。

  • yy: 连续休息 yy 天后,状态重置为“精力充沛”。

规则说明

  1. 初始状态:第 1 天开始时处于“精力充沛”状态。

  2. 工作机制

  • xx 天工作,每天得 aa 分。
  • 从第 x+1x+1 天起如果不休息继续工作,每天得 bb 分。
  1. 休息机制:随时可以开始连续休息 yy 天。休息期间得 0 分,休息结束后重新变为“精力充沛”状态(即又能享受 xx 天的高收益 aa)。

  2. 目标:在 nn 天内通过合理安排工作与休息的时间,求最大化技能点总和。


样例解释

  • 样例 2 (n=4,a=4,b=2,x=3,y=3n=4, a=4, b=2, x=3, y=3)

    • 方案 A:连续工作 4 天。前 3 天得 3×4=123 \times 4 = 12,第 4 天疲劳得 2,总分 12+2=1412+2=14
    • 方案 B:工作 1 天后休息 3 天。总分 4。
    • 最大值:14。
  • 样例 3 (n=5,a=3,b=2,x=3,y=1n=5, a=3, b=2, x=3, y=1)

    • 方案 A:工作 5 天。前 3 天得 3×3=93 \times 3 = 9,后 2 天疲劳得 2×2=42 \times 2 = 4,总分 13。
    • 方案 B:工作 3 天(得 9),休息 1 天,第 5 天重新精力充沛工作(得 3),总分 9+0+3=129+0+3=12
    • 最大值:13。
  • 样例 4 (n=5,a=4,b=1,x=3,y=1n=5, a=4, b=1, x=3, y=1)

    • 由于疲劳收益 b=1b=1 太低,休息 1 天比疲劳工作更划算。
    • 方案:工作 3 天(得 3×4=123 \times 4 = 12),休息 1 天(得 0),第 5 天重新开始工作(得 4),总分 12+0+4=1612+0+4=16
    • 最大值:16。

思路讲解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ll N,a_fresh,b_tired,x_do,y_rest;
cin >> N>>a_fresh>>b_tired>>x_do>>y_rest;
// if (a_fresh==b_tired) {
// cout<<N*a_fresh<<"\n";
// return;
// }
ll l=N*b_tired,r=N*a_fresh;
ll ans=0;
do {
ll num_a=min(x_do,N),num_b=N-num_a;
ll lans=num_a*a_fresh+num_b*b_tired;
ans=max(lans,ans);
}while (false);
do {
ll num_a=N/(x_do+y_rest),rem=N-num_a*(x_do+y_rest);
ll lans=num_a*x_do*a_fresh+min(rem,x_do)*a_fresh+
(rem-min(rem,x_do))*b_tired;
ans=max(lans,ans);
}while (false);
// 最后一段加上的原因见下:
do {
ll num_a=N/(x_do+y_rest);
ll rem=0;
if (num_a>=1) {
rem=N-num_a*(x_do+y_rest);
rem+=y_rest;
}else {
rem=N-num_a*(x_do+y_rest);
}
ll lans=num_a*x_do*a_fresh+rem*b_tired;
ans=max(lans,ans);
}while (false);
cout<<ans<<"\n";

b 和 a,x 的不同关系已经在前两种情况中包含了,但是 b 和 x+a+x 的关系还没有包含。

image

AC代码

心路历程(WA,TLE,MLE……)