int main() { ifstream in; ofstream out; in.open("input.txt"); out.open("output.txt"); int n,a,b,c,d; in>>n; int kas[n][2], st=0, no=0; for (int i=0;i<n;i++) { in >> a >> b >> c >> d; kas[i][0]=a*60+b; kas[i][1]=c*60+d-1; } for (int t=0; t<1440; t++) { for (int i=0;i<n;i++) { if(kas[i][0]!=(kas[i][1]+1)) { if (((kas[i][0]>kas[i][1]) && ((kas[i][0]<=t) || (t<=kas[i][1]))) || (kas[i][0]<=t && t<=kas[i][1])) { } else { no=1; goto hi; } } } hi: if (no == 0) { st++; } else { no = 0; } } out << st; in.close(); out.close(); }
На одном из московских вокзалов билеты продают N касс. Каждая касса работает без перерыва определенный промежуток времени по фиксированному расписанию (одному и тому же каждый день). Требуется определить, на протяжении какого времени в течение суток работают все кассы одновременно. Входные данные
Во входном файле INPUT.TXT сначала располагается одно целое число N (0 < N <= 1000). В каждой из следующих N строк через пробел расположены 4 целых числа, первые два из которых обозначают время открытия кассы в часах и минутах (часы — целое число от 0 до 23, минуты — целое число от 0 до 59), остальные два — время закрытия в том же формате. Числа разделены пробелами.
Время открытия означает, что в соответствующую ему минуту касса уже работает, а время закрытия — что в соответствующую минуту касса уже не работает. Например, касса, открытая с 10 ч 30 мин до 18 ч 30 мин, ежесуточно работает 480 минут.
Если времена открытия и закрытия совпадают, то это означает, что касса работает круглосуточно. Если первое время больше второго, то это означает, что касса начинает работу до полуночи, а заканчивает — на следующий день. Выходные данные
В выходной файл OUTPUT.TXT требуется вывести одно число — суммарное время за сутки (в минутах), на протяжении которого работают все N касс.
Ну я так понимаю добавить три лишних цикла в программу не повредит тем более за одно выполнение программы работает только один из трех циклов. В качестве минутного цикла использовал старт и конец время самой короткоработающей кассы. Сравнил по времени - ощутимо ниже - все же лучше чем сранивать все 24 часа дня, а плюс добавил конечно фишку для случая, если все кассы будут работать 24 часа. В общем код более быстрой программы ниже.
Код
int main() { ifstream in; ofstream out; in.open("input.txt"); out.open("output.txt"); int n,a,b,c,d; in>>n; int kas[n][2], st=0, no=0; int min = 1440, min1 = 0, min2 = 1440; for (int i=0;i<n;i++) { in >> a >> b >> c >> d; kas[i][0]=a*60+b; kas[i][1]=c*60+d-1; if (kas[i][0]!=kas[i][1]+1) { if ( ((kas[i][1]+1)>kas[i][0]) && (((kas[i][1]+1) - kas[i][0]) < min) ) { min = kas[i][1] - kas[i][0] + 1; min1 = kas[i][0]; min2 = kas[i][1] + 1; } else if ( ((kas[i][1]+1)<kas[i][0]) && (( 1440 - kas[i][0] + kas[i][1] ) < min) ) { min = 1440 - kas[i][0] + kas[i][1] + 1; min1 = kas[i][0]; min2 = kas[i][1] + 1; } } }
if (min2 == 1440 && min1 == 0) { st = 1440; } else if (min2 > min1) { for (int t=min1; t<min2; t++) { for (int i=0;i<n;i++) { if(kas[i][0]!=(kas[i][1]+1)) { if (((kas[i][0]>kas[i][1]) && ((kas[i][0]<=t) || (t<=kas[i][1]))) || (kas[i][0]<=t && t<=kas[i][1])) {} else { no=1; goto hi; } } } hi: if (no == 0) { st++; } else { no = 0; } } } else if (min1 > min2) { for (int t=0; t<min2;t++) { for (int i=0;i<n;i++) { if(kas[i][0]!=(kas[i][1]+1)) { if (((kas[i][0]>kas[i][1]) && ((kas[i][0]<=t) || (t<=kas[i][1]))) || (kas[i][0]<=t && t<=kas[i][1])) {} else { no=1; goto hi1; } } } hi1: if (no == 0) { st++; } else { no = 0; } } for (int t=min1; t<1440;t++) { for (int i=0;i<n;i++) { if(kas[i][0]!=(kas[i][1]+1)) { if (((kas[i][0]>kas[i][1]) && ((kas[i][0]<=t) || (t<=kas[i][1]))) || (kas[i][0]<=t && t<=kas[i][1])) {} else { no=1; goto hi2; } } } hi2: if (no == 0) { st++; } else { no = 0; } } } else { st = -999; } out << st; cout << st << endl; in.close(); out.close(); }