답안 #24748

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
24748 2017-06-12T18:30:28 Z Bruteforceman 조교 (CEOI16_popeala) C++11
17 / 100
9 ms 28652 KB
#include "bits/stdc++.h"
using namespace std;
#define prev sdkjflksd

int points[20010];
long long pref[20010];

int result[55][20010];
int prev[55][20010];
vector <int> v[20010];

long long dp[55][20010];
const long long inf = 1e16;
long long maxn[55][20010];

int main(int argc, char const *argv[])
{
	int N, T, S;
	scanf("%d %d %d", &N, &T, &S);

	for(int i = 1; i <= T; i++) {
		scanf("%d", &points[i]);
		pref[i] = pref[i - 1] + points[i];
	}
	for(int i = 1; i <= N; i++) {
		char *s;
		s = new char [T];
		scanf("%s", s);
		for(int j = 1; j <= T; j++) {
			result[i][j] = s[j-1] - '0';
		}
		delete s;
	} 
	for(int i = 1; i <= N; i++) {
		for(int j = 1; j <= T; j++) {
			if(result[i][j] == 1) {
				prev[i][j] = 1 + prev[i][j - 1];
			} else {
				prev[i][j] = 0;
			}
		}
	}
	for(int i = 1; i <= T; i++) {
		vector <int> h;
		for(int j = 1; j <= N; j++) {
			h.push_back(prev[j][i]);
		}
		sort(h.begin(), h.end());
		reverse(h.begin(), h.end());
		for(auto j : h) {
			v[i].push_back(i - j);
		}
		v[i].push_back(i);
	}

	dp[0][0] = 0;
	for(int i = 1; i <= T; i++) {
		dp[0][i] = inf;
	}
	for(int x = 0; x < (int) v[1].size(); x++) {
		maxn[x][0] = dp[0][0] - x * pref[0];
		for(int j = 1; j <= T; j++) {
			maxn[x][j] = min(maxn[x][j - 1], dp[0][j] - x * pref[j]);
		}
	}
	for(int i = 1; i <= S; i++) {
		dp[i][0] = inf;
		for(int j = 1; j <= T; j++) {
			dp[i][j] = inf;
			for(int x = 0; x < (int) v[j].size(); x++) {
				//for(int k = 0; k < v[j][x]; k++) {
				//	dp[i][j] = min(dp[i][j], dp[i - 1][k] + (pref[j] - pref[k]) * x);
				//}
				if(v[j][x] > 0) dp[i][j] = min(dp[i][j], maxn[x][v[j][x] - 1] + pref[j] * x);
			}
		}
		for(int x = 0; x < (int) v[i].size(); x++) {
			maxn[x][0] = dp[i][0] - x * pref[0];
			for(int j = 1; j <= T; j++) {
				maxn[x][j] = min(maxn[x][j - 1], dp[i][j] - x * pref[j]);
			}
		}
	}
	for(int i = 1; i <= S; i++) {
		printf("%lld\n", dp[i][T]);
	}
	return 0;
}

Compilation message

popeala.cpp: In function 'int main(int, const char**)':
popeala.cpp:19:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d", &N, &T, &S);
                               ^
popeala.cpp:22:26: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &points[i]);
                          ^
popeala.cpp:28:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s", s);
                 ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 28520 KB Output is correct
2 Correct 0 ms 28520 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 28652 KB Output is correct
2 Correct 6 ms 28652 KB Output is correct
3 Correct 9 ms 28652 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 0 ms 28520 KB Execution killed because of forbidden syscall writev (20)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 28520 KB Output is correct
2 Correct 0 ms 28520 KB Output is correct
3 Correct 6 ms 28652 KB Output is correct
4 Correct 6 ms 28652 KB Output is correct
5 Correct 9 ms 28652 KB Output is correct
6 Runtime error 0 ms 28520 KB Execution killed because of forbidden syscall writev (20)
7 Halted 0 ms 0 KB -