結果

提出番号 160
提出者 Luzhiled
言語 C++
提出日時 2017-06-30 23:36:52
問題名 (7)ぬいぐるみの整理 (Plush Toys)
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 9ms 70176KB
2 AC 100% 9ms 70208KB
3 AC 100% 9ms 70208KB
4 AC 100% 11ms 70560KB
5 AC 100% 35ms 87504KB
6 AC 100% 79ms 71632KB
7 AC 100% 181ms 103296KB

ソースコード

#include <bits/stdc++.h>
using namespace std;

#define fs first
#define sc second
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define rep(i, n) for (int i = 0; i < n; ++i)
#define pb emplace_back

using pii = pair<int, int>;
using vi = vector<int>;
using lint = long long;

const int inf = 1001001001;
const lint linf = 1001001001001001001ll;
const int mod = 1e9 + 7;
const int dx[]{0, 1, 0, -1, -1, -1, 1, 1}, dy[]{1, 0, -1, 0, -1, 1, -1, 1};

template<typename T> inline bool chmin(T &a, T b) { if (a > b) { a = b; } return a > b; }
template<typename T> inline bool chmax(T &a, T b) { if (a < b) { a = b; } return a < b; }
template<typename T> inline void print(const T &x, string s = "\n") { cout << x << s; }
template<typename T> inline void print(const vector<T> &v, string s = " ") 
{ rep(i, v.size()) cout << v[i] << (i + 1 == v.size() ? "\n" : s); }
inline bool inside(int y, int x, int H, int W) { return 0 <= y && y < H && 0 <= x && x < W; }
inline lint in() { lint x; std::cin>>x; return x; }

int n = in(), m = in();
int a[101010];
int r[20][101010];
int cnt[20];

int dp[1 << 22];

int dfs(int i = 0, int bit = 0, int sum = 0) {
	if (i == m) {
		return 0;
	}

	int &ret = dp[bit];
	if (~ret) return ret;
	ret = inf;
	for (int j = 0, k = 1; j < m; ++j, k <<= 1) {
		if (k & bit) continue;
		int v = sum + cnt[j];
		ret = min(ret, dfs(i + 1, bit + k, v) + cnt[j] - (r[j][v] - r[j][sum]));
	}

	return ret;
}

int main() {
	memset(dp, -1, sizeof(dp));
	for (int i = 1; i <= n; ++i) {
		a[i] = in() - 1;
		r[a[i]][i]++;
		cnt[a[i]]++;
	}

	rep(i, m) rep(j, n) r[i][j + 1] += r[i][j];

	cout << dfs() << endl;
}