結果
| 問題 |
No.5002 stick xor
|
| コンテスト | |
| ユーザー |
square1001
|
| 提出日時 | 2018-05-26 11:59:25 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 980 ms / 1,000 ms |
| コード長 | 1,596 bytes |
| コンパイル時間 | 34,391 ms |
| 実行使用メモリ | 1,628 KB |
| スコア | 38,717 |
| 最終ジャッジ日時 | 2018-05-26 12:00:01 |
|
ジャッジサーバーID (参考情報) |
judge8 / |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 32 |
ソースコード
#include <ctime>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int seed = 123456789;
int rand_gen() {
seed ^= seed << 13;
seed ^= seed >> 17;
seed ^= seed << 5;
return seed;
}
int main() {
int N, K;
cin >> N >> K;
vector<int> L(K);
for (int i = 0; i < K; i++) cin >> L[i];
vector<vector<int> > v(N, vector<int>(N));
for (int i = 0; i < N; i++) {
string s;
cin >> s;
for (int j = 0; j < N; j++) {
v[i][j] = s[j] - '0';
}
}
vector<vector<int> > x = v;
vector<int> vx(K, -1), vy(K, -1);
int score = 0;
int u = clock();
while (clock() - u < 0.970 * CLOCKS_PER_SEC) {
int iniscore = score;
for (int i = 0; i < K; i++) {
if (vx[i] != -1) {
for (int j = vy[i]; j < vy[i] + L[i]; j++) score += (x[vx[i]][j] == 1 ? 1 : -1), x[vx[i]][j] ^= 1;
}
int cur = -1;
vector<pair<int, int> > candy;
for (int j = 0; j < N; j++) {
int sum = 0;
for (int k = 0; k < L[i]; k++) sum += x[j][k];
for (int k = 0; k <= N - L[i]; k++) {
if (sum > cur) {
cur = sum;
candy.clear();
}
if (sum == cur) {
candy.push_back(make_pair(j, k));
}
if (k != N - L[i]) sum += x[j][k + L[i]] - x[j][k];
}
}
pair<int, int> pp = candy[rand() % candy.size()];
int px = pp.first, py = pp.second;
vx[i] = px;
vy[i] = py;
for (int j = py; j < py + L[i]; j++) x[px][j] ^= 1;
score += cur * 2 - L[i];
}
//cout << score << endl;
}
for (int i = 0; i < K; i++) cout << vx[i] + 1 << ' ' << vy[i] + 1 << ' ' << vx[i] + 1 << ' ' << vy[i] + L[i] << endl;
return 0;
}
square1001