HDU6581 휴가 (HDU2019 최초의 멀티 학교 1004)

HDU6581 휴가 (HDU2019 최초의 멀티 학교 1004)

포털 : http://acm.hdu.edu.cn/showproblem.php?pid=6581

질문의 의미 :

N +하여 차량 (1) 길이 L, 마무리 자동차 S까지의 거리의 최대 차속 V를 각각 갖는 차량 자동차

0 차의 속도와 동일한 속도 큰 차와 차 사이의 속도 차가 작은 거리를 단축 할

차량의 전면에서 최종 먼을 찾는 것은 종료 시간에 도달

결승선을 통과하는 차량은 자동차의 뒷면에, 여행 지속적으로 충족 경우에도 영향을 미칩니다

해결 방법 :

다음은 O (n)은 표현에 대해 이야기하기

우선, 우리가 다른 차와 부합하지 않습니다 마지막 자동차, 우리는 [0] / V의에 대한 답을 얻을 수 있습니다 [0]

그런 다음, 우리는 모든 차량이 상황을 충족했다고 가정

도시 된 바와 같이, 단 전부와 제 차 V [N]의 차속에 현재있는 최근 자동차의 끝에 도달하고, 상기 제 차 동시에 수를 충족하기 위해 N + 1 우리 또한 얻을 매우 쉽게, 그리고 마지막으로 차의 프론트 엔드에 도달하는 시간은 pos의 위치에 도달하는 최초의 자동차는 시간을 정확히

\ (t = (\ sum_ {1} ^ {N} L_i + SN) / v_n \)

우리의 마지막 차가 마지막의 끝에 도달하는 우리의 마지막 차의 앞 차와 충돌하면 우리가 생각할 수있는이 두 제한하는 경우로, 전면에 자동차와 충돌하는 계산, I가있는 경우에도 각각의 추가 타격은 자동차가 더 큰 우리의 응답 시간을 느려지 며, 그래서 우리는 같이 차의 최대 값이 시간의 마지막 대회 인 저장 자동차도 대답이 경우 하단의 세 번째

코드 :

#include <set>
#include <map>
#include <cmath>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define bug printf("*********\n")
#define FIN freopen("input.txt","r",stdin);
#define FON freopen("output.txt","w+",stdout);
#define IO ios::sync_with_stdio(false),cin.tie(0)
#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"
#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"
#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<<z<<"]\n"
const int maxn = 3e5 + 5;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
LL quick_pow(LL x, LL y) {
    LL ans = 1;
    while(y) {
        if(y & 1) {
            ans = ans * x % mod;
        } x = x * x % mod;
        y >>= 1;
    } return ans;
}
int l[maxn], s[maxn], v[maxn];
int main() {
#ifndef ONLINE_JUDGE
    FIN
#endif
    int n;
    while(~scanf("%d", &n)) {
        for(int i = 0; i <= n; i++) scanf("%d", &l[i]);
        for(int i = 0; i <= n; i++) scanf("%d", &s[i]);
        for(int i = 0; i <= n; i++) scanf("%d", &v[i]);
        double ans = s[0] * 1.0 / v[0];
        int sum = 0;
        for(int i = 1; i <= n; i++) {
            sum += l[i];
            ans = max(ans, (sum + s[i]) * 1.0 / v[i]);
        }
        printf("%.10f\n", ans);
    }
    return 0;
}

추천

출처www.cnblogs.com/buerdepepeqi/p/11229427.html