156142025-02-21 09:31:22GervidDinamitcpp17Wrong answer 23/501ms396 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <array>

using namespace std;

int main()
{
	iostream::sync_with_stdio(0);
	cin.tie(0);

	int n, m, k, i, j;
	cin >> n >> m >> k;

	vector<vector<int>> grid(n, vector<int>(m)), dp(n, vector<int>(m, INT_MAX)), last(n, vector<int>(m));
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			cin >> grid[i][j];
		}
	}

	dp[0][0] = grid[0][0];
	for (i = 1; i < n; i++) dp[i][0] = dp[i - 1][0] + grid[i][0], last[i][0] = 0;
	for (i = 1; i < m; i++) dp[0][i] = dp[0][i - 1] + grid[0][i], last[0][i] = 1;

	for (i = 1; i < n; i++)
	{
		for (j = 1; j < m; j++)
		{
			dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];
			last[i][j] = (dp[i - 1][j] > dp[i][j - 1]); //which coordinate changed
		}
	}

	priority_queue<int> path;
	path.push(grid[0][0]);
	array<int, 2> node = { n - 1, m - 1 };
	while (node[0] > 0 || node[1] > 0)
	{
		path.push(grid[node[0]][node[1]]);
		node[last[node[0]][node[1]]]--;
	}
	
	for (i = 0; i < k; i++)
	{
		int v = path.top();
		path.pop();
		path.push(v / 2);
	}
	int ans = 0;
	while (!path.empty())
	{
		ans += path.top();
		path.pop();
	}
	cout << ans;
}
SubtaskSumTestVerdictTimeMemory
base23/50
1Accepted0/01ms316 KiB
2Wrong answer0/01ms316 KiB
3Accepted2/21ms316 KiB
4Accepted2/21ms316 KiB
5Accepted3/31ms316 KiB
6Accepted3/31ms316 KiB
7Accepted2/21ms316 KiB
8Accepted3/31ms316 KiB
9Wrong answer0/21ms316 KiB
10Accepted2/21ms316 KiB
11Accepted3/31ms316 KiB
12Wrong answer0/31ms316 KiB
13Wrong answer0/21ms316 KiB
14Accepted3/31ms316 KiB
15Wrong answer0/21ms316 KiB
16Wrong answer0/31ms316 KiB
17Wrong answer0/21ms316 KiB
18Wrong answer0/31ms316 KiB
19Wrong answer0/21ms316 KiB
20Wrong answer0/31ms316 KiB
21Wrong answer0/21ms396 KiB
22Wrong answer0/31ms316 KiB