两场考试满分 400、600。设两场最高分为 A,B,第 i 人标准得分 ci=round(1000(Aai+Bbi))。已知 n 与所有 ci(c1=2000,其余在 [10,1990]),构造任意一组合法原始分 ai∈[0,400]、bi∈[0,600]。
A、B 由你的输出决定,等于各自那列的最大值。第 1 人 c1=2000,两场都满,故 a1=A、b1=B,可自行指定 A、B。
关键是消掉四舍五入。取 A=200、B=500,则
ci=1000(200ai+500bi)=5ai+2bi.
右端恒为整数,舍入不再起作用,只需解方程 5ai+2bi=ci,且 ai∈[0,200]、bi∈[0,500]。
由 bi=2ci−5ai,要求 ci−5ai 为非负偶数且不超过 1000。两个条件确定 ai:
- 方程两边对 2 取模,得 ai≡ci(mod2)。
- 由 bi≤500 得 ai≥5ci−1000。
取满足下界的最小整数 ai=max(0,⌈5ci−1000⌉),整数写法为 max(0,⌊(ci−996)/5⌋)。若其奇偶与 ci 不符则加 1,再令 bi=2ci−5ai。
可验证如此得到的 ai≤198、bi≤500,故第 1 人的 a1=200、b1=500 恰为两列最大值,A=200、B=500 成立,构造自洽。
时间复杂度为 O(n)。
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,c;
cin>>n>>c;
cout<<"200 500\n";
for(int i=2;i<=n;i++)
{
cin>>c;
int a=max(0,(c-996)/5);
if((a^c)&1)a++;
cout<<a<<' '<<(c-5*a)/2<<'\n';
}
return 0;
}