首页 > 其他分享 >Codeforces 1672 E. notepad.exe

Codeforces 1672 E. notepad.exe

时间:2022-10-26 22:13:49浏览次数:58  
标签:exe cout int notepad Codeforces 2000 每行 flag 排版

题意

这是一道交互题,有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;
}

标签:exe,cout,int,notepad,Codeforces,2000,每行,flag,排版
From: https://www.cnblogs.com/4VDP/p/16830277.html

相关文章

  • JavaScript works behind the scenes —— execution context(执行上下文)
    JavaScriptworksbehindthescenes——executioncontext(执行上下文)Whatisexecutioncontext?什么是执行上下文EnvironmentinwhichapieceofJavaScriptise......
  • Codeforces Round #690 (Div. 3) F
    F.TheTreasureofTheSegments理解题意就是要让我们找一个线段+他相交的所有线段max我们暴力枚举线段然后用sum-不相交的不相交的就好算了只有两种情况一个线段左......
  • Codeforces Round #830 (Div. 2) A-D
    比赛链接A题解知识点:贪心,数论。先求出序列最大公约数\(d\),如果为\(1\)直接输出\(0\)。否则,尝试用最后一个数操作,\(gcd(d,n)=1\)则可以,花费为\(1\)。否则......
  • Educational Codeforces Round 109 (Rated for Div. 2) D
    D.Armchairs我们发现性质这前面的0显然是给第一个1匹配而不会前面0的给第二个后面的给第一个显然不优有了这个性质我们就可以通过0来做文章要是这个位置是0我们显......
  • Codeforces Round #715 (Div. 2) C
    C.TheSportsFestival观察发现我们显然选择一个数字开始后我们拿周围的数字显然存在最优解(sort过)这样就很金典了n=2000我们显然可以暴力区间dp然后将转移只用从拿......
  • Codeforces Round #697 (Div. 3) D
    D.CleaningthePhone金典贪心吧先sort从大到小考虑12两种情况显然要是我们当前now+最大的一个1那我们就直接break了继续我们知道了我们现在+最大的一个1不够我们......
  • Codeforces Round #735 (Div. 2) C
    C.Mikasa显然我们应该用log或者O(1)的时间来回答一个ans当n>m时显然我们不能n^m==0所以直接cout0(1)我们知道的是n^i=?那么显然n^?=i(2)然后对于每一个n^i的值是不同的......
  • Android Studio报错:Error:Execution failed for task':app:mergeDebugResources'
    Build失败,原因是我添加的图片不符合AndroidStudio的审核要求,添加两行代码,禁用审核在app目录下的build.gradle中的android{...}增加配置android{.......aaptOptions.crun......
  • Codeforces Round #729 (Div. 2) B. Plus and Multiply (数论/暴力)
    https://codeforces.com/contest/1542/problem/B题目大意:有一个无限集合生成如下:1在这个集合中。如果x在这个集合中,x⋅a和x+b都在这个集合中。给定nab,问我们n......
  • Codeforces Round #743 A
    A.Book拓扑序我们一眼就能看出来主要是如何求读书的遍数我最开始想的就是把拓扑序处理出来类似于要几遍上升序列能把他全部覆盖显然求一遍不上升子序列即可但是我......