Ссылка: https: //codeforces.com/contest/1282/problem/C
Значение вопросов: человек, чтобы сдать экзамен, экзамен только два вопроса, один на простые вопросы, каждый вопрос отнимает много времени пофиксить, а другой трудные вопросы, каждый вопрос отнимает много времени фиксированного б, чтобы гарантировать, что Ь> а. Решить оценка проблемы является 1. Правила письменного экзамена не только вопросы и т.д., сколько, чтобы поощрять назначение заранее. Если вы не имеете задание загодя, то есть часть названия будет отображаться как «обязательно делать проблему», когда «должен сделать вопрос» в теме не будет полностью завершен, этот курс, даже если 0, в противном случае, количество вопросов, чтобы получить тот же счет, в том числе и «должен делать» и «несущественные делать».
Смысл проблем: Это ясный смысл вопросов, необходимых по названию «должны сделать время» в порядке возрастания, затем жадные делают, должен делать с самого начала времени, пересекающим каждый вопрос. Если траверс я-й титул, текущее время T, то T-1, если задание в то время, сначала необходимо поставить перед всеми вопросами должны делать сделано, предполагая, что этот процесс занимает время Ti, то остальную часть Т - Ti время, то мы жадные в оставшееся время как можно больше, чтобы сделать первый с остальным простым вопросом, сделать головоломки, записанные в это время ANS, по-прежнему через все темы должны сделать время, в конце концов, постоянно обновляемый анс максимум. Окончательный анс ответ
AC код:
1 #include <iostream> 2 #include < строка > 3 #include <вектор> 4 #include <CString> 5 #include <cstdio> 6 #include <Алгоритм> 7 с использованием пространства имен STD; 8 ЬурейеЕ долго долго LL; 9 LL мод = 1e9 + 7 ; 10 Const INT maxn = 2e5 + 10 ; 11 структура узла { 12 INT диф; 13 ИНТ ти; 14 } г [maxn]; 15 BOOL CMP (узел а, узел б) { 16 , если (a.ti = b.ti!) возвращение a.ti < b.ti; 17 возврата a.dif < b.dif; 18 } 19 INT основных () { 20 INT д; CIN >> д; 21 в то время как (q-- ) { 22 LL п, т, а, б; 23 CIN >> п >> т >> A >> б; 24 LL CNTA = 0 , cntb = 0 ; 25 для ( Int I = 1 ; я <= п; я ++ ) { 26 INTТД; КИН >> Td; 27 ПЧ (ТД == 0 ) CNTA ++ ; 28 остальное CNTB ++ ; 29 G [I] , .dif = TD; 30 } 31 для ( INT I = 1. , Я <= п, я ++ ) { 32 INT Т; КИН >> Т; 33 G [I] , .ti = Т; 34 } 35 Сортировка (G + . 1 , п + G + 1. , СМР); // время прессования будет делать для сортировки 36 G [п + 1. ] .ti Т + = 1 .; 37 [ LL АНС = 0 , С1 = 0 , С2 = 0 ; // C1 - C2 - сосчитать число будет делать при условии 38 для ( INT I = 1. ; I <= п + 1. , Я ++ ) { 39 LL CUR = A * С1 * в + С2; 40 раз LL = G [I] .ti - . 1 - CUR; // будет делать время , необходимое для субъекта 41 IF (время> = 0 ) { // Если есть дополнительное время, как это делают более более простые вопросы, проблемы делают 42 МР ТП = мин (Время / а, cnta- С1); 43 Time- ТА * = а; 44 LL Тв = мин (время / б, cntb- с2); 45 ANS = макс (ANS, с1 + с2 + ТА + ТБ); 46 } 47 , если (г [я] .dif == 0 ) с1 ++ ; 48 еще c2 ++ ; 49 } 50 COUT << ANS << ENDL; 51 } 52 возврата 0 ; 53 }