CodeForces 988 F Rain and Umbrellas

Rain and Umbrellas

题意:某同学从x=0的点走到x=a的点,路上有几段路程是下雨的, 如果他需要经过这几段下雨的路程, 需要手上有伞, 每一把伞有一个重量, 求走到重点重量×路程的最小花费。

题解:暴力,如果某段路程需要带伞,就直接去找前面有伞的地点,如果不需要伞就直接往后走就好了。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e5;
 4 const int INF = 0x3f3f3f3f;
 5 int rain[N];
 6 int w[N];
 7 int dp[N];
 8 int main(){
 9     int a, n, m, l, r;
10     scanf("%d%d%d", &a, &n, &m);
11     for(int i = 1; i <= n; i++){
12         scanf("%d%d", &l, &r);
13         for(int j = l; j <= r; j++)
14             rain[j] = i;
15     }
16     memset(dp, INF, sizeof(dp));
17     memset(w, INF, sizeof(w));
18     for(int i = 1; i <= m; i++){
19         scanf("%d%d", &l, &r);
20         w[l] = min(w[l], r);
21     }
22     dp[0] = 0;
23     for(int i = 0; i < a; i++){
24         if(rain[i] == rain[i+1]  && rain[i]){
25             for(int j = 0; j <= i; j++)
26                 if(w[j]!=INF) dp[i+1] = min(dp[i+1], dp[j]+(i+1-j)*w[j]);
27         }
28         else dp[i+1] = dp[i];
29     }
30     printf("%d
",dp[a]>=INF ? -1 : dp[a]);
31 
32 }
CF 988 F