cf 534B. Covered Path

http://codeforces.com/problemset/problem/534/B

题意是说一辆车,每秒内的速度恒定...第I秒到第I+1秒的速度变化不超过D。初始速度为V1,末速度为V2,经过时间t,问最远能走多远。

策略就是尽可能加速...加到某个时间,如果在这个时间不开始减速就回不到V2了。

从后往前预处理下每秒钟能达到的最大速度(如果超过这个速度,将不能减回到V2)

 1    
 2    /* ***********************************************
 3    Author :111qqz
 4    Created Time :2016年02月22日 星期一 23时49分32秒
 5    File Name :code/cf/problem/534B.cpp
 6    ************************************************ */
 7    
 8    #include <iostream>
 9    #include <cmath>
10    #include <cstring>
11    #include <algorithm>
12    
13    using namespace std;
14    const int N=1E2+5;
15    const int inf=8E9;
16    int a[N],m[N];
17    int v1,v2,t,d,tmp,p,ans,n;
18    
19    
20    int main()
21    {
22        cin>>v1>>v2>>t>>d;
23        p = inf;
24        memset(a,0,sizeof(a));
25        a[1]= v1;
26        tmp = v2;
27        m[t]= v2;
28        for ( int i = t-1 ; i >= 1; i--)
29        {
30            tmp = tmp+d;
31            m[i] = tmp;
32        }
33        for ( int i =2 ;i <= t; i++ )
34        {
35            if (a[i-1]+d<=m[i])
36            {
37                a[i] = a[i-1] + d;
38            }
39            else
40            {
41                a[i] = m[i];
42                p = i;
43                break;
44            }
45        }
46        ans = 0;
47        for ( int i = p ; i <= t; i++ )
48            a[i] = m[i];
49        for ( int i = 1; i <= t ; i++ )
50        {
51            if (i<p)
52                ans = ans + a[i];
53            else ans = ans + m[i];
54        }
55       // for ( int i = 1; i <= t ; i++)
56       //     cout<<"a[i]:"<<a[i]<<endl;
57        cout<<ans<<endl;
58    
59        return 0;
60    }
61