Hugo_thichay

 avatar
duyvan
plain_text
2 years ago
4.9 kB
27
Indexable
//thi chay
Hugo Thi Chạy
Sắp tới công ty nên Hugo làm việc tổ chức sự kiện Olympic dành cho toàn bộ nhân viên. Có rất nhiều bộ môn thi đấu như Bóng bàn, cầu long, cờ vua, cờ tướng, bơi lội, và có cả thể thao điện tử nữa. Là một người quan tâm tới sức khỏe của bản thân vì vậy Hugo thường xuyên chạy bộ để rèn luyện sức khỏe. Thật may trong các môn thi đấu Olympic có hạng mục này. Trong quá trình tập luyện Hugo đã luyện cho mình được 5 kiểu chạy khác nhau, mỗi kiểu chạy sẽ tiêu tốn số lượng năng lượng nhất định và thời gian chạy hết 1km là khác nhau. Mỗi kiểu chạy sẽ sử dụng cho 1km.

Năng lượng của Hugo là có hạn, nếu sử dụng vượt Hugo sẽ bị bệnh.


Sau khi tham khảo thông tin Hugo biết được quãng đường cần chạy bộ D của cuộc thi. Nhân viên y tế có thể giúp Hugo tính toán được số năng lượng tối đa của Hugo.
Cho thông tin của 5 kiểu chạy của Hugo bao gồm số phút, số giây (số phút <= 6 và số giây <= 60) và số năng lượng tiêu tốn.
Hãy tính thời gian ngắn nhất để Hugo về đích mà không bị bệnh.

 

Input

Dòng đầu số test T (T<=50)

Mỗi test bao gồm 2 dòng

Dòng 1 chứa số năng lượng tối đa M <=60 và chiều dài quãng đường D<=40km
Dòng thứ 2 chứa thông tin của 5 kiểu chạy lần lượt là số phút, số giây, số năng lượng tiêu tốn

 

Output
In ra thời gian ngắn nhất để Hugo về đích mà không bị bệnh theo dạng số phút, số giây. Nếu không thể hãy in ra -1

 

Input

4

297 10

5 38 23 5 22 12 4 16 6 5 38 20 0 20 17

192 10

2 6 12 6 5 24 2 22 22 4 13 12 4 30 16

503 10

1 42 20 1 8 14 0 33 15 2 6 6 5 3 16

122 10

2 37 21 3 59 22 6 0 22 4 56 5 0 9 10

 

Output

Case #1

3 20

Case #2

21 0

Case #3

5 30

Case #4

1 30

//======================================
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int T, M, D;
bool type[5];
int res_min, res_sec, minu, sec;

struct Run{
	int minutes;
	int second;
	int energy;
	bool used;
};

Run TypeRun[5];

void timecvt(int &minutes, int &second){
	if (second/60 >= 1){
		minutes += second/60;
		second = second%60;
	}
}

void backtrack(int stanima, int distances, int type){
	if (stanima > M) return; // out of energy
	
	if (distances == D){
		int tmp_min = minu, tmp_sec = sec;
		timecvt(tmp_min, tmp_sec);
		if (tmp_min < res_min){
			res_min = tmp_min;
			res_sec = tmp_sec;
		}
		else if (tmp_min == res_min && tmp_sec < res_sec){
			res_min = tmp_min;
			res_sec = tmp_sec;
		}
		return;	
	}
	
	if (minu > res_min) return;


	for (int i=type;i<5;i++){
		stanima += TypeRun[i].energy;
		minu += TypeRun[i].minutes;
		sec += TypeRun[i].second;

		backtrack(stanima, distances+1, i);

		stanima-= TypeRun[i].energy;
		minu -= TypeRun[i].minutes;
		sec -= TypeRun[i].second;
	}

}

int main(){
//	freopen("input.txt", "r", stdin);
	cin >> T;
	for (int tc=1;tc<=T;tc++){
		res_min = res_sec = 999999;
		cin >> M >> D;
		for (int i=0;i<5;i++){
			cin >> TypeRun[i].minutes >> TypeRun[i].second >> TypeRun[i].energy;
			TypeRun[i].used = false;
		}
		backtrack(0,0,0);
		if (res_min == 999999) cout << "Case #" <<  tc << endl << -1 << endl;
		else{
			timecvt(res_min, res_sec);
			cout << "Case #" <<  tc << endl << res_min << " " << res_sec << endl;	
		}
	}
	return 0;
}

//========================

#include <iostream>
using namespace std;
#define max_int 100000000
int T, M, D, mi, se;
// min-second-energy: second = min*60second
int second[6], energy[6];
int ans;

void nhap(){
	cin >> M >> D;
	for(int i=0; i<5;i++){
		int minutes; cin >> minutes;
		int secon; cin >> secon;
		second[i] = secon + 60*minutes;
		cin >> energy[i];
	}
}
void backtrack(int type, int uEnergy, int time, int dis) {
	if(uEnergy > M || time > ans)
		return;
	if(type == 5) {
		if (dis == 0 && time < ans)
			ans = time;
		return;
	}
	backtrack(type + 1, uEnergy, time, dis);
	for(int i = 1; i <= dis; i++){
		backtrack(type + 1, uEnergy + i * energy[type], time + i*second[type], dis - i);
	}
}
/*void timeFinish(int k, int time, int uEnergy) {
	if(time > ans || uEnergy > M)
		return;
	if(k >= D) {
		if (time < ans)
			ans = time;
		return;
	}
	for(int type = 0; type < 5; type++) {
		timeFinish(k + 1, time + second[type], uEnergy + energy[type]);
	}
}*/

int main(){
	freopen("INP.txt","r",stdin);
	cin >> T;
	for(int tc=1; tc<=T; tc++){
		nhap();
		ans = max_int;
		backtrack(0, 0, 0, D);
		//timeFinish(0,0,0);
		mi = ans/60;
		se = ans%60;
		cout << "Case #" << tc << endl;
		if (ans == max_int)
			cout << "-1" << endl;
		else
			cout << ans/60 << " " << ans%60 << endl;
	}
	return 0;
}
Editor is loading...
Leave a Comment