题意: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 }