【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[_] << '\t'; 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\n", (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,保证输入的数字都是整数

你可能感兴趣的:(IP)