- 唐瑾恒 的博客
p2 题目总结
- @ 2024-8-30 12:41:10
基础算法:
- 枚举
- 模拟,高精度
- 贪心
- 前缀和与差分
- 双指针
- 二分查找和二分答案
- 离散化和区间合并
P0204 小田滑雪
先分别对时间和距离的两个失误记录进行排序,再用两个双指针 , 指向时间和距离的数组头,用 记录当前距离, 记录当前时间, 当前失误次数
如果时间记录先,,
否者 ,
最后再计算一次
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int n , p;
vector<double> d , t;
char op;
signed main(){
freopen("snow.in" , "r" , stdin);
freopen("snow.out" , "w" , stdout);
cin >> n;
for(int i = 1 ; i <= n ; i ++){
cin >> op >> p;
if(op == 'T') t.push_back(p);
else d.push_back(p);
}
sort(d.begin() , d.end());
sort(t.begin() , t.end());
d.push_back(1e9) , t.push_back(1e9);
int i = 0 , j = 0;
double dist = 0 , ans = 0 , res = 0;
while(i < d.size() - 1 || j < t.size() - 1){
res ++;
if(dist + (t[j] - ans) / res < d[i]){
dist += (t[j] - ans) / res;
ans = t[j];
j ++;
}else{
ans += (d[i] - dist) * res;
dist = d[i];
i ++;
}
}
ans += (1000 - dist) * (res + 1);
cout << (long long)(ans + 0.5);
return 0;
}