编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
#24353 #1146. ddd和斑马 Accepted 100 58 ms 9480 K C++ 11 / 1.6 K nocriz🦆 2020-04-24 16:41:51
显示原始代码
#include "guess.h"
#include <map>
#include <string>
#include <cstring>
#include <cstdlib>
#include <assert.h>
#include <iostream>
#define set0(x) memset(x, 0, sizeof(x))
using namespace std;
int qz[1010], qued[1010][1010], vis[1010][1010];
char ooo[4040], *ocr = ooo + 2000;
int que(int l, int r) {
    if (vis[l][r])
        return qued[l][r];
    vis[l][r] = 1;
    return qued[l][r] = query(l - 1, r - 1);
}
string guess() {
    srand(4100625);
    set0(qued);
    set0(vis);
    set0(ooo);
    ocr[que(1, 1000)]++;
    for (int i = 1; i <= 999; i++) {
        int c = que(1, i) + que(i + 1, 1000);
        ocr[c]++;
        if (ocr[c] >= 50) {
            qz[1000] = c;
            break;
        }
    }
    string S;
    for (int i = 1; i <= 50; i++) {
        set0(ooo);
        ocr[qz[1000] - que(i + 1, 1000)]++;
        for (int j = 500; j < 600; j++) {
            int cc = qz[1000] - que(i + 1, j) - que(j + 1, 1000);
            ocr[cc]++;
            if (ocr[cc] >= 4 && cc >= qz[i - 1] && cc <= qz[i - 1] + 1) {
                qz[i] = cc;
                break;
            }
        }
    }
    for (int i = 999; i >= 950; i--) {
        set0(ooo);
        for (int j = 1; j < 50; j++) {
            int cc = que(j + 1, i) + qz[j];
            ocr[cc]++;
            if (ocr[cc] >= 4 && cc <= qz[i + 1] && cc >= qz[i + 1] - 1) {
                qz[i] = cc;
                break;
            }
        }
    }
    for (int i = 51; i <= 500; i++) {
        set0(ooo);
        for (int j = 1000; j >= 950; j--) {
            int cc = qz[j] - que(i + 1, j);
            ocr[cc]++;
            if (ocr[cc] >= 2 && cc >= qz[i - 1] && cc <= qz[i - 1] + 1) {
                qz[i] = cc;
                break;
            }
        }
    }
    for (int i = 501; i <= 950; i++) {
        set0(ooo);
        for (int j = 0; j < 50; j++) {
            int cc = qz[j] + que(j + 1, i);
            ocr[cc]++;
            if (ocr[cc] >= 2 && cc >= qz[i - 1] && cc <= qz[i - 1] + 1) {
                qz[i] = cc;
                break;
            }
        }
    }
    for (int i = 1; i <= 1000; i++) S += '0' + qz[i] - qz[i - 1];
    return S;
}
子任务 #1
Accepted
得分:100
测试点 #1
Accepted
得分:100
用时:58 ms
内存:9480 KiB

输入文件(guess1.in

100
001010100001100110001011101110101101011000111101001000011000111111100011010110011000010000111000
<104077 bytes omitted>

用户输出

Jh8oMRv4OKtLqCgzu397UY6bDsy2wja0WNSkXmfcTdEeiPQpVBxr1nGFZlA5IH
Accepted Answer: queries used = 5707
5707

Special Judge 信息

Accepted Answer: queries used = 5707

系统信息

Exited with return code 0