P8948 题解

Jerrlee✅

2023-01-16 18:03:57

Solution

题意不简述了,来直接上思路。 ## 思路 你想啊,既然 $c_i \in [10,1990]$,那其实即使有 $n$ 次询问,即使 $n \in [1,10^4]$,$c_i$ 的值也不会逃出给定的那个范围,于是我们往预处理方向去思考。 紧接着,发现 $a_i \in [0,400]$,同时 $b_i \in [0,600]$,数据范围很小,尝试从这两个地方入手。 设定这个“十分强的小朋友 Qiu”两场考试全部 AK。orz 然后别的同学的分数从 $1$ 分到 Qiu 的分数枚举,算出一个 $c_i$,存下来,发现这样做并不会超时,同时算出的 $c_i$ 也能覆盖题目所要求的区间。 于是我们写出了一个如下的循环: ```cpp for(int i=1;i<=400;i++) for(int j=1;j<=600;j++) ``` 然后在这个循环内部去把每一个 $c_i$ 的值算出来,算出来就存入一个 `pair` 里面,最后根据询问给定的 $c_i$ 的值,直接回答 `pair` 中存储的元素即可。 ## 细节 注意到题目提到了四舍五入,我们使用 C++ 给定的函数 `round()` 就行了,记得里面的数开 `double`,再强制转换为 `int` 即可。 至于 `long long`,在这题显然不用,为了防止被卡时间(虽然这题不会),不开。 ## 代码 赛时骗了点分,打球去了。是赛后补题的代码。 ```cpp #define fi first #define se second int main(){ int n; cin>>n; int a[n+1]; pair<int,int> p[1999]; for(int i=1;i<=400;i++){ for(int j=1;j<=600;j++){ double x=i/400.0,y=j/600.0; p[(int)round(1000*x+1000*y)].fi=i; p[(int)round(1000*x+1000*y)].se=j; } } for(int i=1;i<=n;i++){ cin>>a[i]; cout<<p[a[i]].fi<<" "<<p[a[i]].se<<endl; } } ``` [AC 记录](https://www.luogu.com.cn/record/100000526)