【noip模拟题】挖掘机(模拟题+精度)

这题直接模拟。

可是我挂在了最后两个点上QAQ。唯一注意的是注意精度啊。。。用来double后边转成整数就忘记用longlong。。。sad

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define mkpii make_pair<int, int>
#define pdi pair<double, int>
#define mkpdi make_pair<double, int>
#define pli pair<ll, int>
#define mkpli make_pair<ll, int>
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '	'; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }

const int N=200005;
int a[N], b[N], n, m, bn, an;
const double eps=1e-5;
char s[10];
int main() {
	read(n); read(m);
	for1(i, 1, n) {
		scanf("%s", s);
		int t=getint();
		if(s[0]=='T') b[++bn]=t;
		else { if(t<m) a[++an]=t; }
	}
	sort(b+1, b+1+bn);
	sort(a+1, a+1+an);
	int i=1, j=1;
	double pos=0, ans=0;
	while(i<=an && j<=bn) {
		double sp=(1.0/(double)(i+j-1));
		double at=((double)a[i]-pos)*(i+j-1)+ans;
		if(at<(double)(b[j])) {
			pos=a[i++];
			ans=at;
		}
		else {
			pos+=sp*((double)b[j]-ans);
			if(pos+eps>m) break;
			ans=(double)b[j++];
		}
	}
	while(i<=an && (pos+eps)<=m) { ans+=((double)a[i]-pos)*(double)(i+j-1); pos=a[i++]; }
	while(j<=bn && (pos+eps)<=m) { pos+=(1.0/(double)(i+j-1))*((double)b[j]-ans); ans=(double)b[j++]; }
	if(pos+eps<=m) ans+=(double)(m-pos)*(double)(i+j-1);
	printf("%lld
", (ll)(ans+eps));
	return 0;
}

  


背景

附中机房谁最虚?高二一班***!感觉很顺,是吧?

题目描述

今天,丧尸czy开着挖掘机去上学(……)。但是他发现他的mz满天下,所以一路上他碰到了好多他的mz。一开始他以1km/min的速度(=60km/h……)开着挖掘机前进。他发现他只会在恰好到达某一时刻或者到达某个距离遇到mz。每次遇到mzczy都会毫不犹豫的把她们顺路捎走(^_^)。但是他实在是太虚了,以至于当有imz他的速度下降1/(i+1)。具体说,一开始czy1km/min速度前进,有1mz的时候速度变为1/2 km/min,有2个时变为1/3 km/min……以此类推。现在问题来了,给出每个mz在何时出现,请你算出czy到学校要多久。

格式

输入第一行2个数nm,分别表示mz数和czy与学校的距离(km)

接下来2n+1行由字符串与数字构成

Dist x表示在距离达到x km时出现一个mz

Time x表示在时间达到x min时出现一个mz

输出一个整数,表示到达学校的时间。如果不能整除,直接输出整数部分即可。

样例输入

2 20

Time 3

Dist 10

样例输出

47

数据范围

对于30%数据,n,m<=50

对于50%数据,n,m<=2000

对于100%数据,n,m<=200000,x<=10^9,保证输入的数字都是整数

原文地址:https://www.cnblogs.com/iwtwiioi/p/4070885.html