제출 #895364

#제출 시각아이디문제언어결과실행 시간메모리
895364ksujay2Cookies (JOI23_cookies)C++17
85 / 100
1057 ms882212 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false), cin.tie(nullptr); int N; cin >> N; vector<int> A(N); int sm = 0; for(int i = 0; i < N; i++) { cin >> A[i]; sm += A[i]; } vector<int> cnt(sm + 1); for(int ai : A) cnt[ai]++; vector<int> lim(sm + 1); int left = N; for(int i = 1; i <= sm; i++) { lim[i] = lim[i - 1] + left; left -= cnt[i]; } int M; cin >> M; vector<int> B(M); for(int i = 0; i < M; i++) cin >> B[i]; vector<vector<int>> dp(sm + 1); for(int i = 0; i <= sm; i++) dp[i].resize(lim[i] + 1, -1); dp[0][0] = 0; for(int i = M - 1; i >= 0; i--) { for(int j = 0; j < sm; j++) { for(int k = j * B[i]; k < dp[j].size() && k + B[i] < dp[j + 1].size(); k++) { if(dp[j][k] != -1 && dp[j + 1][k + B[i]] == -1) { dp[j + 1][k + B[i]] = B[i]; } } } } int best = -1; for(int i = 0; i <= sm; i++) { if(sm < dp[i].size() && dp[i][sm] != -1) { best = i; break; } } cout << best << endl; if(best != -1) { vector<int> c; int curi = best, curj = sm; while(curi != 0) { c.push_back(dp[curi][curj]); curj -= dp[curi][curj]; curi--; } set<pair<int, int>> s; for(int i = 0; i < N; i++) s.insert({A[i], i}); for(int i = best - 1; i >= 0; i--) { auto p = s.rbegin(); vector<int> changed; cout << c[i] << " "; for(int j = 0; j < c[i]; j++) { cout << (*p).second + 1 << " "; changed.push_back((*p).second); p++; } for(int j : changed) { s.erase({A[j], j}); s.insert({--A[j], j}); } cout << endl; } for(int i = 0; i < N; i++) assert(A[i] == 0); } }

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

cookies.cpp: In function 'int main()':
cookies.cpp:30:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |             for(int k = j * B[i]; k < dp[j].size() && k + B[i] < dp[j + 1].size(); k++) {
      |                                   ~~^~~~~~~~~~~~~~
cookies.cpp:30:64: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |             for(int k = j * B[i]; k < dp[j].size() && k + B[i] < dp[j + 1].size(); k++) {
      |                                                       ~~~~~~~~~^~~~~~~~~~~~~~~~~~
cookies.cpp:39:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |         if(sm < dp[i].size() && dp[i][sm] != -1) {
      |            ~~~^~~~~~~~~~~~~~
#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...