Codeforces 1672 E. notepad.exe
题意
这是一道交互题,有n个字符串,每个字符串长度:0-2000, n :0-2000
有一个机器对他进行排版,你可以给他一个每行的最大宽度w,那么每行只能放长度为w的字符;
每行相邻两个字符串之间至少有一个空格,每行结尾可以不用,机器会按照贪心原则进行排版,保证排版后的高度尽量小。
你可以进行n+30次询问,每次询问你可以给个w,他会给你排版后高度h,让你求出w*h的最小值。
做题吐槽
这题很典型的构造题,不会就是不会,会了一下子就会做了,这种题感觉就是要一下子找到题目的突破点,挖掘出这类题目的特征,感觉自己还是菜,每个突破点想到了,但是没串连起来,继续加油!
提示
1. 答案的范围变化是很小的,变化范围只有0-2000
2. 当 h= 1 的时候,很显然是最优的w是每个字符空一格 
3. 当求出h = 1时候的答案h*w = s时,在h改变时,最多就是换行符号替换了空格,s变化为s-(h-1),并且需要整除h,那么只有一个点 s/h 满足
4. 这样就做出来了,先二分找出h=1时,w的最小值,对后续每个h高度询问一次检查一下就可得到最终解
反正很玄妙,如何想到变化范围小,如何想到整除,我感觉只能这种题只能从极值考虑,例如h=1,h=n这些点看看有没有什么特征,根据特征再去推理过程
代码
#include<bits/stdc++.h>
using namespace std;
void run() {
    int n;
    cin >> n;
    int l = 2 * n - 1, r = n * 2000 + n, flag = -1;
    while (l <= r) {
        int mid = (l + r) >> 1;
        int x;
        cout << "? " << mid << endl;
        cin >> x;
        if (x == 1) {
            flag = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    int s = flag;
//    cout<<s<<endl;
    int ans = s;
    for (int i = 2; i <= n; i++) {
        cout << "? " << s / i << endl;
        int x;
        cin >> x;
        if (x)
            ans = min(ans, x * (s / i));
    }
    cout << "! " << ans << endl;
}
int main() {
    run();
    return 0;
}
Codeforces 1672 E. notepad.exe的更多相关文章
- 让notepad.exe的utf8不添加BOM
		实在是厌烦了notepad的utf8模式了,于是决定修改之,方案如下: 使用任何支持hex模式的编辑器打开%SystemRoot%/system32/notepad.exe查找二进制串56 8D 45 ... 
- upx压缩notepad.exe(运行时压缩)
		PEView:https://www.lanzous.com/i5k9vbg UPX:https://www.lanzous.com/i5k9vch notepad.exe:https://www.l ... 
- Reverse Core 第二部分 - 14&15章 - 运行时压缩&调试UPX压缩的notepad
		@date: 2016/11/29 @author: dlive 0x00 前言 周六周日两天在打HCTF2016线上赛,没时间看书,打完比赛接着看~~ 0x01 运行时压缩 对比upx压缩前后的no ... 
- 给notepad++添加右键菜单
		Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\Shell\NotePad++] [HKEY_CLASSES_ROOT\*\Shel ... 
- 【转】无法将notepad++添加到打开方式列表中的解决办法
		问题:想要设置notepad++为默认打开方式,却发现在点击browse找到notepad++.exe点击打开后没有在打开方式列表中找到notepad++. 原因:更新程序版本后程序的路径发生了变动. ... 
- notepad++与vivado关联
		notepad++与vivado关联 打开vivado软件,选择菜单栏“Tools——>Options…”,在弹出的对话框中,选择General选项卡,如图1所示. 图1 选择General选 ... 
- ASP.NET、C#调用外部可执行exe文件--多种方案
		一. try { //方法一 //调用自己的exe传递参数 //Process proc = new Process(); //proc.StartInfo.FileName = @"D:\ ... 
- EXE捆绑器
		释放的方法真没想到 太神奇了 // 文件捆绑器Dlg.cpp : 实现文件 // #include "stdafx.h" #include "文件捆绑器.h" ... 
- Notepad++配置Python开发环境
		1. 安装Python 1 下载 我选择了32位的2.7版本.https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi 2. 安装 安装的时候可 ... 
随机推荐
- 在centos服务器里安装opencv的坑:mportError: libXrender.so.1: cannot open shared object file: No such file or directory and wrong ELF class: ELFCLASS32
			centos7服务器安装opencv (其他版本服务器一样) 安装opencv: pip install opencv-python 导入cv2 import cv2 报错:importError: ... 
- 051_末晨曦Vue技术_处理边界情况之provide和inject依赖注入
			provide和inject依赖注入 点击打开视频讲解更详细 在此之前,在我们描述访问父级组件实例的时候,展示过一个类似这样的例子: <google-map> <google-map ... 
- SpringMvc 如何同时支持 Jsp 和 Json 接口?
			后端同学基本都会见过这种场景:在同一个工程中,有些页面使用jsp模版渲染,同时还有其他接口提供Json格式的返回值.为了同时支持这两种场景,我们一般是如何处理的呢? 其实非常简单: 1.在项目中为 S ... 
- Excel 插入嵌入式图表和独立图表的方法
			描述 嵌入式图表:是一种与当前工作表相同位置的图表,且悬浮在表格之上,不受表格限制,因此称之为嵌入式图表. 独立图表:是独立于当前工作表的图表,打印时,需要单独将其打印出来. 插入独立图表的图文教程: ... 
- cobaltstrike进行局域网远控
			用cobaltstrike进行局域网远控 cobalt strike(简称CS)是一款团队作战渗透测试神器,分为客户端及服务端,一个服务端可以对应多个客户端,一个客户端可以连接多个服务端. 实验原理: ... 
- KingbaseES R3 集群主库归档失败案例
			案例说明: 本案例用于KingbaseES R3集群归档进程归档日志失败的处理,对于一线的生产环境具有 一定的参考意义. 数据库版本: TEST=# select version(); VERSION ... 
- gem5 使用记录,对例子中helloobject的理解
			gem5中有一个 hello的例子,不是hello world那个,在src/learning-gem5/part2里面,这是虽然是个简单的例子但包含的要素挺多挺全. 整个结构是src下面有一个hel ... 
- SpringMvc(四)- 下载,上传,拦截器
			1.图片下载 图片下载:将服务器端的文件以流的形式写到客户端,通过浏览器保存到本地,实现下载: 1.1 图片下载步骤 1.通过session获取上下文对象(session.getServletCont ... 
- C++ 二级指针与 const 关键字
			可用七种不同的方式将 const 关键字用于二级指针,如下所示: //方式一:所指一级指针指向的数据为常量,以下几种为等效表示 const int ** pptc; //方式一 int const * ... 
- C#,根据路径获取某个数字开头的所有文件夹,并获取最新文件夹进行替换文件
			项目需求获取某路径下为1开头文件夹,并替换最新文件夹内容,话不多说,上代码 private void Form1_Load(object sender, EventArgs e) { try { st ... 
