[CF1292E]Rin and The Unknown Flower

2024-03-16 23:18
文章标签 unknown flower rin cf1292e

本文主要是介绍[CF1292E]Rin and The Unknown Flower,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Rin and The Unknown Flower

题解

再次吐槽一下CF的spj,WA了不手动退出竟然会返回T

我们很容易发现本题记录询问次数的方法有些奇怪,很容易发现,询问长度越长,代价就会越低。
但很明显,询问长度变成只会使得我们的收获减小。所以我们尽量还是先减短我们询问的长度,得出结果。

我们发现,如果我们先询问"CH",“CC”,“CO”,“HO”,“OO"的话,就可以知道除了第n位以外哪些位为"C”,除了第1位以外哪些位为"O"。于是, ( 1 , n ) (1,n) (1,n)中剩下的没填的就只能为"H"。
现在第1位如果没有的话只剩下"H","O"两种选择,询问其中一个就可以知道其值。第n位同理。
这样做的代价为 5 4 + 1 ( n − 1 ) 2 + 1 n 2 \frac{5}{4}+\frac{1}{(n-1)^2}+\frac{1}{n^2} 45+(n1)21+n21。对于 n > 4 n>4 n>4的情况都可以过,但 n = 4 n=4 n=4时代价 > 7 5 >\frac{7}{5} >57,需要单独处理。

n = 4 n=4 n=4时,我们先询问"CH",“CC”,“CO”,“HO"四种情况。
我们发现,此时,如果第 2 2 2位为"O"的话,前三位只有"OOO"与"OOH"两种情况。
如果询问"OOO"与"OOH"时有解,我们只需再枚举第四位即可。此时的代价为 11 9 + 1 8 < 7 5 \frac{11}{9}+\frac{1}{8}<\frac{7}{5} 911+81<57
如果都不对的话,第二位与第三位都只能为"H”。此时第一位只能为"H"或"O",第n位只能为"C"或"H"。各自询问一次就能有解。代价为 4 3 + 1 16 < 7 5 \frac{4}{3}+\frac{1}{16}<\frac{7}{5} 34+161<57

这样,就可以将这道题解决了。

源码

贞德难调

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef long long LL;
const int INF=0x7f7f7f7f;
typedef unsigned long long uLL;
typedef pair<int,int> pii;
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while('0'>s||'9'<s){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
} 
int t,n,len;
char str[55],qstr[55];
void ask(){//for(int i=1;i<=len;i++)if(!qstr[i])qstr[i]='H';printf("? %s\n",qstr+1);fflush(stdout);int k;read(k);for(int i=1;i<=k;i++){int id;read(id);for(int j=0;j<len;j++)str[j+id]=qstr[j+1];}
}
void print(){//for(int i=1;i<=n;i++)if(!str[i])str[i]='H';printf("! %s\n",str+1);fflush(stdout);int k;read(k);if(!k&&str[1]=='H'&&str[2]=='O')exit(0);
}
signed main(){read(t);int tt=0;while(t--){memset(str,0,sizeof(str));memset(qstr,0,sizeof(qstr));read(n);if(n>4){len=2;qstr[1]='C';qstr[2]='H';ask();qstr[1]='C';qstr[2]='O';ask();qstr[1]='C';qstr[2]='C';ask();qstr[1]='H';qstr[2]='O';ask();qstr[1]='O';qstr[2]='O';ask();for(int i=2;i<n;i++)if(!str[i])str[i]='H';if(!str[1]){len=n-1;for(int i=2;i<=len;i++)qstr[i]=str[i];qstr[1]='O';ask();if(!str[1])str[1]='H';}if(!str[n]){len=n;for(int i=1;i<len;i++)qstr[i]=str[i];qstr[n]='C';ask();if(!str[n])str[n]='H';//printf("strn%c\n",str[n]);}print();continue;}else{len=2;qstr[1]='C';qstr[2]='H';ask();qstr[1]='C';qstr[2]='O';ask();qstr[1]='C';qstr[2]='C';ask();qstr[1]='H';qstr[2]='O';ask();int sum=0;for(int i=1;i<=4;i++)if(!str[i])sum++;if(!sum){print();continue;}if(sum==1){int id;for(int i=1;i<=4;i++)if(!str[i])id=i;len=4;for(int i=1;i<=4;i++)qstr[i]=str[i];qstr[id]='O';ask();if(str[id]){print();continue;}qstr[id]='H';ask();if(!str[id])str[id]='C';print();continue;}if(sum==2){if(!str[2]){len=3;qstr[1]='O';qstr[2]=str[3];qstr[3]=str[4];ask();if(!str[2])str[2]='H';len=4;for(int i=2;i<=4;i++)qstr[i]=str[i];qstr[1]='O';ask();if(!str[1])str[1]='H';}else if(!str[3]){len=3;qstr[1]=str[1];qstr[2]=str[2];qstr[3]='O';ask();if(!str[3])str[3]='H';len=4;for(int i=1;i<=3;i++)qstr[i]=str[i];qstr[4]='O';ask();if(str[4]){print();continue;}qstr[4]='H';ask();if(!str[4])str[4]='C';}else if(!str[4]){len=3;qstr[3]=str[3];qstr[2]=str[2];qstr[1]='O';ask();if(!str[1])str[1]='H';len=4;for(int i=1;i<=3;i++)qstr[i]=str[i];qstr[4]='O';ask();if(str[4]){print();continue;}qstr[4]='H';ask();if(!str[4])str[4]='C';}print();continue;}len=3;qstr[1]=qstr[2]=qstr[3]='O';ask();qstr[3]='H';ask();if(str[3]){if(str[1]&&str[4])tt=1;else if(!str[1]){len=4;for(int i=2;i<5;i++)qstr[i]=str[i];qstr[1]='O';ask();if(!str[1])str[1]='H';}else if(!str[4]){len=4;for(int i=1;i<4;i++)qstr[i]=str[i];qstr[4]='O';ask();if(str[4]){print();continue;}qstr[4]='H';ask();if(!str[4])str[4]='C';}print();continue;}if(!str[2])str[2]=str[3]='H';len=3;qstr[1]=qstr[2]=qstr[3]='H';ask();if(!str[1])str[1]='O';len=4;for(int i=1;i<4;i++)qstr[i]=str[i];qstr[4]='H';ask();if(!str[4])str[4]='C';print();continue;}}return 0;
}

谢谢

这篇关于[CF1292E]Rin and The Unknown Flower的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817062

相关文章

linux下 ping: unknown host www.baidu.com” 解决方法

问题现象 :   ping 和 telnet 都无法正常使用   而nslookup 可以正常解析到域名 $ ping  www.baidu.com  ping: unknown host  www.baidu.com $ telnet baidu.com 80  baidu.com/80: Name or service not known

Servlet mapping specifies an unknown servlet name Action

看一下web.xml中<servlet-mapping>有没有配错

Unknown command: “create-react-app“

在创建react项目时出现报错" Unknown command: "create-react-app" " 解决方法: 配置变量,在要创建的目录下打开控制栏,输入下列命令,回车等待结束即可: npx create-react-app 项目名称   可能遇见的错误: 1. npm error network 'proxy' config is set properly.  S

hive远程调试问题java.net.UnknownHostException: unknown host: master

解决办法如下:在C:\WINDOWS\system32\drivers\etc\hosts文件中添加“如下“信息: 192.x.x.x master 注:之前我有遇到改下project中hdfs-site.xml下的master:10000改为ip:10000就好了,但是今天发现这招失灵了,ε=(´ο`*)))唉。改了这个之后能够sqlContext.sql("show databases

PHP Warning: File upload error - unable to create a temporary file in Unknown on line 0

服务器突然出现这种提示,无法上传文件和图片,怎么解决? PHP Warning: File upload error - unable to create a temporary file in Unknown on line 0 1.因为php.ini中没有设置上传的临时文件,默认为系统的临时文件地址。 2.如果没有权限去读系统的临时文件目录的话就会产生上述错误。 解决的方法就

ubuntu16.04--mount:unknown filesystem type ‘exfat‘。解决方法:sudo apt-get install exfat-utils

新买的移动硬盘,为了让windows和ubuntu都能够识别,于是格式化成exfat格式,然后连接到ubuntu电脑上之后提示不识别exfat格式。 Error mounting /dev/sdc1 at /media/chw/Elements: Command-line `mount -t "exfat" -o "uhelper=udisks2,nodev,nosuid,uid=1000,gi

MySQL 报 Unknown or incorrect time zone: 'Asia/Shanghai' 错

一般是因为mysql中缺少了关于timezone的表 可以到http://dev.mysql.com/downloads/timezones.html下载对应版本的sql语句 一般是下载posix标准的那张表 解压之后, 再终端 登陆mysql 查看mysql的版本在终端直接 输入 mysql -V //未登录进mysql的时候 mysql -u root -p密码use mys

Linux ping:unknown host问题排查

一、检查网卡配置:输入ifconfig可以查看当前网卡配置的IP地址并且查看配置文件中网络的设置: [root@bqh-01 ~]# ifconfigeth0 Link encap:Ethernet HWaddr 00:0C:29:71:FC:1E inet addr:192.168.0.117 Bcast:192.168.0.255 Mask:255.255.255.0i

Keil The selected deivce“xxx“is unknown。。。识别到芯片依然烧录不进去程序解决或者未识别

之前一直用DAP烧录,用Jlink后烧录发现不行 在网上找了很多教程,版本等问题都一一排查依然不行 最后通过修改Port解决。。。。 将JTAG改成SW后就可识别芯片并且可以烧录。。。。

poj 2750 Potted Flower(线段树区间合并)

http://poj.org/problem?id=2750 有n个数围成一个圈,每次可以将a位置上的数变为b,对每个操作,输出区间的最大连续子段和,连续的子段长度不能超过n。 区间合并问题,因为是求连续子段的和。先把圈从1和n之间断开,变为一条链,先在链上求最长连续的和。这个最长连续的和取左节点最长连续和,右节点最长连续和,左节点从右边数最大连续和加上右节点从左边数最大连续和三者