Submission #1171077

#TimeUsernameProblemLanguageResultExecution timeMemory
1171077userro1234324Two Dishes (JOI19_dishes)C++20
10 / 100
107 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]; 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]; } } 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]); } int main() { wczytaj(); znajdz_ile_mozna_skonczyc_innych(); podzadanie3(); }

Compilation message (stderr)

dishes.cpp: In function 'void wczytaj()':
dishes.cpp:14:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   14 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
dishes.cpp:17:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |         scanf("%d %lld %d", &pom, &czasy_maksymalne1[i], &punkty1[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dishes.cpp:22:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   22 |         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...