Submission #1073784

#TimeUsernameProblemLanguageResultExecution timeMemory
1073784horiaboeriuKpart (eJOI21_kpart)C++17
100 / 100
607 ms852 KiB
#include <stdio.h> #include <stdlib.h> #define MAX 50000 #define MAXN 1000 char f[MAXN + 1]; int v[MAXN + 1], dp[2][MAX + 1];//dp[i][x] este cea mai mare pozitie de pe care incepe un subsir cu suma x care se termina pe o pozitie <= i //dar voi tine mereu doar pentru i si i - 1 ca sa nu ocup foarte multa memorie int main() { int t1, i1, n, i, t, sum, x, s, j, nr; scanf("%d", &t1); for (i1 = 0; i1 < t1; i1++) { for (i = 0; i <= MAX; i++) { dp[0][i] = dp[1][i] = 0; } scanf("%d", &n); sum = 0; for (i = 1; i <= n; i++) { f[i] = 0; scanf("%d", &v[i]); sum += v[i]; } sum = sum / 2 + 1; //o sa fac dp si o sa iau fiecare secventa din n si ar trebui sa existe un subsir in acea secventa care sa aiba suma cat jumatatea din suma secventei t = 1; for (i = 1; i <= n; i++) { for (x = sum - v[i]; x > 0; x--) { dp[t][x + v[i]] = dp[1 - t][x] > dp[1 - t][x + v[i]] ? dp[1 - t][x] : dp[1 - t][x + v[i]]; } for (x = 0; x < v[i]; x++) { dp[t][x] = dp[1 - t][x];//x nu se poate obtine cu v[i], deci rezultatul este cel de la i - 1 } dp[t][v[i]] = i;//suma v[i] se poate obtine de pe poz i s = 0; for (j = i; j > 0; j--) { s += v[j]; if (s % 2 > 0 || dp[t][s / 2] < j) { f[i - j + 1] = 1; } } t = 1 - t; } nr = 0; for (i = 1; i <= n; i++) { nr += 1 - f[i]; } printf("%d ", nr); for (i = 1; i <= n; i++) { if (f[i] == 0) { printf("%d ", i); } } printf("\n"); } return 0; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:11:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 |     scanf("%d", &t1);
      |     ~~~~~^~~~~~~~~~~
Main.cpp:16:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |         scanf("%d", &n);
      |         ~~~~~^~~~~~~~~~
Main.cpp:20:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |             scanf("%d", &v[i]);
      |             ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...