제출 #1171096

#제출 시각아이디문제언어결과실행 시간메모리
1171096userro1234324Two Dishes (JOI19_dishes)C++20
10 / 100
101 ms31816 KiB
#include <bits/stdc++.h> using namespace std; int n, m; const int maxn = 1000001; long long czasy_skonczenia1[maxn]; long long czasy_skonczenia2[maxn]; long long czasy_maksymalne1[maxn]; long long czasy_maksymalne2[maxn]; int punkty1[maxn]; int punkty2[maxn]; //long long punkty_pref1[maxn]; long long punkty_pref2[maxn]; int ile_mozna_skonczyc_innych1[maxn]; int ile_mozna_skonczyc_innych2[maxn]; void wczytaj() { scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) { int pom; scanf("%d %lld %d", &pom, &czasy_maksymalne1[i], &punkty1[i]); czasy_skonczenia1[i] = pom + czasy_skonczenia1[i - 1]; } for (int i = 1; i <= m; i++) { int pom; scanf("%d %lld %d", &pom, &czasy_maksymalne2[i], &punkty2[i]); czasy_skonczenia2[i] = pom + czasy_skonczenia2[i - 1]; punkty_pref2[i] = punkty_pref2[i - 1] + punkty2[i]; } } void znajdz_ile_mozna_skonczyc_innych1(int i) { if (czasy_skonczenia1[i] > czasy_maksymalne1[i]) { ile_mozna_skonczyc_innych1[i] = -1; return; } int pocz = 0, kon = m; while (pocz < kon) { int srodek = (pocz + kon + 1) / 2; if (czasy_skonczenia1[i] + czasy_skonczenia2[srodek] <= czasy_maksymalne1[i]) pocz = srodek; else kon = srodek - 1; } ile_mozna_skonczyc_innych1[i] = pocz; return; } void znajdz_ile_mozna_skonczyc_innych2(int i) { if (czasy_skonczenia2[i] > czasy_maksymalne2[i]) { ile_mozna_skonczyc_innych2[i] = -1; return; } int pocz = 0, kon = n; while (pocz < kon) { int srodek = (pocz + kon + 1) / 2; if (czasy_skonczenia2[i] + czasy_skonczenia1[srodek] <= czasy_maksymalne2[i]) pocz = srodek; else kon = srodek - 1; } ile_mozna_skonczyc_innych2[i] = pocz; return; } void znajdz_ile_mozna_skonczyc_innych() { for (int i = 1; i <= n; i++) znajdz_ile_mozna_skonczyc_innych1(i); for (int i = 1; i <= m; i++) znajdz_ile_mozna_skonczyc_innych2(i); } long long najlepszy_wynik_punktowy[2001][2001]; void podzadanie3() { for (int i = 1; i <= n; i++) { najlepszy_wynik_punktowy[i][0] = najlepszy_wynik_punktowy[i - 1][0]; if (ile_mozna_skonczyc_innych1[i] >= 0) najlepszy_wynik_punktowy[i][0] += punkty1[i]; } for (int i = 1; i <= m; i++) { najlepszy_wynik_punktowy[0][i] = najlepszy_wynik_punktowy[0][i - 1]; if (ile_mozna_skonczyc_innych2[i] >= 0) najlepszy_wynik_punktowy[0][i] += punkty2[i]; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { najlepszy_wynik_punktowy[i][j] = max(najlepszy_wynik_punktowy[i - 1][j] + (j <= ile_mozna_skonczyc_innych1[i]) * punkty1[i], najlepszy_wynik_punktowy[i][j - 1] + (i <= ile_mozna_skonczyc_innych2[j]) * punkty2[j]); } } printf("%lld", najlepszy_wynik_punktowy[n][m]); } long long w = -2000000000000000; void podzadanie1() { long long suma_punktow1 = 0; for (int i = 1; i <= n; i++) suma_punktow1 += punkty1[i]; for (int i = n; i >= 0; i--) { if (ile_mozna_skonczyc_innych1[i] == -1) { suma_punktow1 -= punkty1[i]; continue; } w = max(w, suma_punktow1 + punkty_pref2[ile_mozna_skonczyc_innych1[i]]); } printf("%lld", w); } int main() { wczytaj(); znajdz_ile_mozna_skonczyc_innych(); if (n <= 2000 && m <= 2000) { podzadanie3(); return 0; } podzadanie1(); }

컴파일 시 표준 에러 (stderr) 메시지

dishes.cpp: In function 'void wczytaj()':
dishes.cpp:16:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
dishes.cpp:19:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |         scanf("%d %lld %d", &pom, &czasy_maksymalne1[i], &punkty1[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dishes.cpp:24:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 |         scanf("%d %lld %d", &pom, &czasy_maksymalne2[i], &punkty2[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...