zoukankan      html  css  js  c++  java
  • 【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,保证输入的数字都是整数

  • 相关阅读:
    1月6日 作业 穷举
    1.4 作业
    12月31日 作业
    12月29日-练习成果
    12月30日作业-<转>字符集编码
    1.22作业
    集合
    泛型
    CPU接口练习 (仅以此程序证明 某个同学真的有毒!有毒!!!)
    继承知识点总结
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/4070885.html
Copyright © 2011-2022 走看看