Untitled
unknown
plain_text
2 years ago
2.3 kB
21
Indexable
#include<iostream>
using namespace std;
int Time[3][2], adv[3][2];
int point[52], arrival[52], duaration[52];
int nTestcase, N, P1, P2, P3, Maxpoint;
bool check(int k, int t){
if(k == 0) return true;
if(k == 1){
int a = t + adv[1][0];
if(t < Time[0][0] && t + adv[1][0] > Time[0][0]) return false;
if(t < Time[0][1] && t + adv[1][0] > Time[0][1]) return false;
if(t > Time[0][0] && t + adv[1][0] < Time[0][1]) return false;
if(t < Time[0][1] && t + adv[1][0] > Time[0][1]) return false;
}
if(k == 2){
int a = t + adv[1][0];
int b = t + adv[2][0];
if(t < Time[0][0] && t + adv[1][0] > Time[0][0]) return false;
if(t < Time[0][1] && t + adv[1][0] > Time[0][1]) return false;
if(t > Time[0][0] && t + adv[1][0] < Time[0][1]) return false;
if(t < Time[0][1] && t + adv[1][0] > Time[0][1]) return false;
//
if(t < Time[1][0] && t + adv[2][0] > Time[1][0]) return false;
if(t < Time[1][1] && t + adv[2][0] > Time[1][1]) return false;
if(t > Time[1][0] && t + adv[2][0] < Time[1][1]) return false;
if(t < Time[1][1] && t + adv[2][0] > Time[1][1]) return false;
}
return true;
}
void resetPoint(){
for(int i = 0; i < N; i++){
point[i] = 0;
}
}
int findScore(){
resetPoint();
int temp, sum;
for(int i = 0; i < N; i++){
int start = arrival[i];
int end = start + duaration[i];
for(int j = 0; j < 3; j++){
if(start <= Time[j][0] && end >= Time[j][1]){
temp = adv[j][1];
point[i] = point[i] < temp ? temp : point[i];
}
}
}
sum = 0;
for(int i = 0; i < N; i++){
sum += point[i];
}
return sum;
}
void backtrack(int k){
if(k == 3){
int sum = findScore();
Maxpoint = Maxpoint > sum ? Maxpoint : sum;
return;
}
for(int i = 1; i < 50; i++){
if(check(k,i)){
Time[k][0] = i;
Time[k][1] = i + adv[k][0];
backtrack(k+1);
Time[k][0] = 0;
Time[k][1] = 0;
}
}
}
int main(){
freopen("input.txt","r",stdin);
cin >> nTestcase;
for(int testcase = 1; testcase <= nTestcase; testcase++){
cin >> N >> adv[0][0] >> adv[1][0] >> adv[2][0] >> adv[0][1] >> adv[1][1] >> adv[2][1];
Maxpoint = 0;
for(int i = 0; i < N; i++){
cin >> arrival[i] >> duaration[i];
point[i] = 0;
}
backtrack(0);
cout << "Case #" << testcase << endl << Maxpoint << endl;
}
return 0;
}Editor is loading...
Leave a Comment