P8948 题解
Jerrlee✅
2023-01-16 18:03:57
题意不简述了,来直接上思路。
## 思路
你想啊,既然 $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)