ZOJ-3941 Kpop Music Party

ZOJ-3941

题意:Edward想去参加音乐会,每次参加完音乐会只之后都会持续K天的兴奋(从今天到今天+K-1天), 现在共有n场音乐会, 每场音乐会都有一个开始时间和结束时间,并且他能选择其中的M天去参加, 现在求他能兴奋的总天数最多。

题解:如果他在第一段时间能用完所有的次数(有效利用的情况下),那么就算不把次数留到后面去他的总天数也是等效的,所以去除有效利用之后,再搜一下每一段的最后一天参不参加的状态就好了,一共10段,2^10也才1e3,接下来就是处理一下细节然后DFS搜索就好了。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define fi first
 5 #define se second
 6 #define lson l,m,rt<<1
 7 #define rson m+1,r,rt<<1|1
 8 #define max3(a,b,c) max(a,max(b,c))
 9 const int INF = 0x3f3f3f3f;
10 typedef pair<ll , ll> pll;
11 pll p[15];
12 ll N, K, M;
13 ll ans = 0;
14 void Dfs(int i, ll to, ll len, ll time)
15 {
16     if(time <= 0 || i == N+1)
17     {
18         ans = max(ans, len);
19         return ;
20     }
21     ll b = max(to, p[i].fi);
22     ll e = p[i].se;
23     if(b >= e)
24     {
25         Dfs(i+1, to, len, time);
26         if(e+K > to)
27         Dfs(i+1, e+K, len+(e+K-b), time-1);
28         return;
29     }
30     ll tt = ((e-b+1)%K == 0)? (e-b+1)/K : (e-b+1)/K+1;
31     if(tt > time) tt = time;
32     Dfs(i+1, b+tt*K, len+tt*K, time-tt);
33     if(tt+1 <= time)
34     Dfs(i+1, e+K, len+e-b+K, time-tt-1);
35 }
36 int main()
37 {
38     ios::sync_with_stdio(false);
39     cin.tie(0);
40     cout.tie(0);
41     int T;
42     while(cin >> T)
43     {
44         while(T--)
45         {
46             cin >> N >> K >> M;
47             ans = 0;
48             for(int i = 1; i <= N; i++)
49                 cin >> p[i].fi >> p[i].se;
50             sort(p+1, p+1+N);
51             Dfs(1,0,0,M);
52             cout << ans << endl;
53         }
54     }
55     return 0;
56 }

 

posted @ 2018-02-21 17:35  Schenker  阅读(224)  评论(0编辑  收藏  举报