QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#416489 | #2409. 猜词 | pwx2009 | 100 ✓ | 4696ms | 4104kb | C++20 | 3.7kb | 2024-05-21 21:38:46 | 2024-05-21 21:38:47 |
Judging History
answer
#include"word.h"
#include <bits/stdc++.h>
using namespace std;
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
typedef long long ll;
const int N=9000;
char Ans[N][5];
const char fir[30][7]={
"slier","lares","lares","tores","tarns","arles", "lares", "lares", "snare",
"ousel","ranis","nares","tares","aides","tries", "lares", "raise", "aides",
"plate","nares","snare","riles","nares","cones", "kanes", "aeons"
};
void init(int num_scramble, const char *scramble) {
for(int i=0;i<num_scramble;i++){
for(int j=0,k=i*5;j<5;j++,k++)
Ans[i][j]=scramble[k];
}
}
int ans[8];
bool ok[30][7];
bool mn[30];
int d[N],cnt;
int should[30],tot;
char A[7];
int sum[30];
void check(int x){
for(int i=0;i<5;i++)
if(!ok[Ans[x][i]-'a'][i])
return;
bool flag=true;
for(int i=0;i<5&&flag;i++)
sum[Ans[x][i]-'a']++;
for(int i=1;i<=tot&&flag;i++)
if(!sum[should[i]]&&mn[should[i]])
flag=0;
for(int i=0;i<5;i++)
sum[Ans[x][i]-'a']=0;
if(flag)
d[++cnt]=x;
}
int work(int x,int y){
int u=0;
int w[8];
w[0]=1;
for(int i=1;i<6;i++)w[i]=w[i-1]*3;
for(int i=0;i<5;i++){
if(Ans[x][i]==Ans[y][i]);
else sum[Ans[y][i]-'a']++;
}
for(int i=0;i<5;i++){
if(Ans[x][i]==Ans[y][i]){
u+=2*w[i];
continue;
}
if(sum[Ans[x][i]-'a']){
sum[Ans[x][i]-'a']--;
u+=w[i];
}
}
for(int i=0;i<5;i++)
sum[Ans[y][i]-'a']=0;
return u;
}
int sure[10];
bool must[30][10];
const char *guess(int num_testcase, int remaining_guesses, char initial_letter, bool *gold, bool *silver) {
// your code here
bool have[30];
int num;
memset(have,0,sizeof have);
if(remaining_guesses==5){
memset(ans,0,sizeof ans);
memset(must,0,sizeof must);
memset(mn,0,sizeof mn);
memset(ok,1,sizeof ok);
for(int i=0;i<26;i++)ok[i][0]=0;
num=initial_letter-'a';
ok[num][0]=1;
must[num][0]=1;
mn[num]=1;
ans[5]=8869;
for(int i=0;i<5;i++)
Ans[8869][i]=A[i]=fir[num][i];
return A;
}
for(int i=0;i<5;i++){
num=Ans[ans[remaining_guesses+1]][i]-'a';
if(gold[i]){
for(int j=0;j<26;j++)
if(num!=j)ok[j][i]=0;
mn[num]=1;
must[num][i]=1;
continue;
}
if(silver[i]){
mn[num]=1;
ok[num][i]=0;
continue;
}
}
for(int i=0;i<5;i++){
num=Ans[ans[remaining_guesses+1]][i]-'a';
if(gold[i])continue;
if(silver[i])continue;
for(int j=0;j<5;j++)
if(!must[num][j])
ok[num][j]=0;
}
tot=cnt=0;
for(int i=0;i<26;i++){
if(mn[i])
should[++tot]=i;
// printf("%c %d ",i+'a',mn[i]);
// for(int j=0;j<5;j++)printf("%d",ok[i][j]);
// putchar(10);
}
for(int i=0;i<8869;i++)check(i);
if(cnt==1){
for(int i=0;i<5;i++)
A[i]=Ans[d[1]][i];
return A;
}
if(cnt==0){
ans[remaining_guesses]=0;
for(int i=0;i<5;i++)
A[i]=Ans[ans[remaining_guesses]][i];
return A;
}
ans[remaining_guesses]=d[1];
if(cnt>2){
long double now=0,Mn=0,pi;
bool flag=0;
int S[250];
for(int i=0;i<8869;i++){
now=0.0;
pi=1.0;
pi=pi/cnt;
memset(S,0,sizeof S);
for(int j=1;j<=cnt;j++){
int k=work(i,d[j]);
S[k]++;
if(k==242)now+=1.0/cnt*5.5;
}
flag=0;
for(int j=0;j<243;j++){
pi=S[j]*1.0/cnt;
if(S[j]==0);
else now-=1.0*pi*log2f(pi),flag=1;
}
for(int j=0;j<6&&flag;j++)
if(j!=remaining_guesses&&i==ans[j])
flag=0;
if(now>Mn&&flag){
Mn=now;
ans[remaining_guesses]=i;
}
}
}
// printf("%.7Lf ",Mn);
for(int i=0;i<5;i++)
A[i]=Ans[ans[remaining_guesses]][i];
return A;
}
详细
Test #1:
score: 100
Accepted
time: 4696ms
memory: 4104kb
input:
1000 258971 aahedaaliiaarghabacaabaciabackabaftabakaabampabaseabashabateabayaabbasabbesabbeyabbotabeamabeleabetsabhorabideabledablerablesabmhoabodeabohmaboilabomaaboonabortaboutaboveabrisabuseabutsabuzzabyesabysmabyssacariacerbacetaachedachesachooacidsacidyacingaciniackeeacmesacmicacnedacnesacockaco...
output:
100.000
result:
points 1.0 finished