結果
| 問題 | No.3418 【絶望】30個並列ごちゃ混ぜHit&Blowで遊ぼう! |
| コンテスト | |
| ユーザー |
simasima_71
|
| 提出日時 | 2025-12-06 01:49:03 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 311 ms / 5,000 ms |
| コード長 | 4,281 bytes |
| 記録 | |
| コンパイル時間 | 3,203 ms |
| コンパイル使用メモリ | 304,040 KB |
| 実行使用メモリ | 28,376 KB |
| スコア | 9,994,849 |
| 平均クエリ数 | 51.51 |
| 最終ジャッジ日時 | 2025-12-24 23:46:58 |
| 合計ジャッジ時間 | 30,834 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 100 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for (ll i = (l); i < (r); ++i)
#define all(x) (x).begin(), (x).end()
using ll = long long;
using pl = pair<ll,ll>;
using vl = vector<ll>;
using vvl = vector<vector<ll>>;
using vi = vector<int>;
using vvi = vector<vector<int>>;
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
vector<vector<int>> hbtoid={
{0,1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14},
{15,16,17},
{18},
{19}
};
vector<int> idtoh={0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,3,3,3,4,5};
vector<int> idtob={0,1,2,3,4,5,0,1,2,3,4,0,1,2,3,0,1,2,0,0};
int hbsim(string a,string b){
int ih=0;
rep(i,0,a.size())if(a[i]==b[i])ih++;
a+=b;
sort(all(a));
int ib=-ih;
rep(i,0,a.size()-1)if(a[i]==a[i+1])ib++;
return hbtoid[ih][ib];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
vector<string> slis;
string s="00000";
for(s[0]='0';s[0]<='9';s[0]++){
for(s[1]='0';s[1]<='9';s[1]++){
for(s[2]='0';s[2]<='9';s[2]++){
for(s[3]='0';s[3]<='9';s[3]++){
for(s[4]='0';s[4]<='9';s[4]++){
int a=0;
rep(i,0,5){
rep(j,i+1,5)if(s[i]==s[j])a=1;
}
if(a==0)slis.push_back(s);
}
}
}
}
}
vector<bool> u(30240,true);
vector<vector<int>> g;
vector<vector<int>> gg;
vector<vector<int>> h;
vector<int> nm;
vector<vector<int>> cc;
int bnow=-1;
while(true){
int a=0;
if(bnow==-1){
rep(i,0,u.size()){
if(u[i]){
a=i;
break;
}
}
}
else a=bnow;
cout<<slis[a]<<endl;
nm.push_back(a);
bnow=-1;
u[a]=false;
rep(k,0,h.size()){
h[k][cc[k][a]]--;
}
vector<int> d(20);
rep(i,0,30){
int a,b;
cin>>a>>b;
if(a==-1&&b==-1)return 0;
d[hbtoid[a][b]]++;
}
if(d[19]==30)break;
g.push_back(d);
gg.push_back(d);
gg[gg.size()-1][19]=0;
if((gg.size()>=2&&(g[g.size()-1][19]>g[g.size()-2][19]))||(gg.size()==1&&gg[0][19]==1)){
rep(i,0,gg.size()-1){
int id=cc[i][a];
gg[i][id]--;
if(gg[i][id]==0){
rep(j,0,u.size()){
if(!u[j])continue;
int id2=cc[i][j];
if(id==id2){
u[j]=false;
rep(k,0,h.size()){
h[k][cc[k][j]]--;
}
}
}
}
}
}
vector<int> e(20);
vector<int> f(20);
vector<int> c(u.size());
rep(i,0,u.size()){
if(!u[i])continue;
int id=hbsim(slis[i],slis[a]);
c[i]=id;
if(d[id]==0){
u[i]=false;
rep(k,0,h.size()){
h[k][cc[k][i]]--;
}
}
if(u[i]){
e[id]++;
f[id]=i;
}
}
cc.push_back(c);
h.push_back(e);
int mn=1000;
rep(i,0,h.size()){
rep(j,0,19){
if(h[i][j]>0&&gg[i][j]>0)mn=min((h[i][j]+gg[i][j]-1)/gg[i][j],mn);
}
}
long double nowd=-1000000000;
int nebnow=0;
int sm=0;
int dd=30-d[19];
rep(i,0,u.size())if(u[i])sm++;
rep(i,0,u.size()){
if(u[i]){
long double znow=0;
rep(j,0,h.size()){
if(h[j][cc[j][i]]==0)break;
if(h[j][cc[j][i]]==gg[j][cc[j][i]])znow+=100000;
else znow+=log((long double)1/h[j][cc[j][i]])/log(gg[j][cc[j][i]]+1);
}
if(znow>nowd){
nowd=znow;
nebnow=i;
}
}
}
bnow=nebnow;
}
}
simasima_71