首页 > 其他分享 >[TJOI2007]路标设置 题解

[TJOI2007]路标设置 题解

时间:2023-06-20 23:55:54浏览次数:44  
标签:tmp 二分 return 路标 题解 cin int tag TJOI2007

题目链接:https://www.luogu.com.cn/problem/P3853

题目大意:给出一个递增数组,插入K个值,使其差分数列的最大值最小;值得注意的是,此题中每个数字都是整数

考点:整数二分


错误思路:利用堆排,取最大值直接二分

code:

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int l , n , k;
 6 //int a[1000010];
 7 priority_queue < int > a;
 8 
 9 signed main()
10 {
11     cin >> l >> n >> k;
12     int l , r;cin >> l;
13     for(int i = 1;i < n;i ++)
14     {
15         cin >> r;
16         a.push( r - l );
17         r = l;
18     }
19     int tmp;bool tag;
20     while( k -- )
21     {
22         tmp = a.top();
23         a.pop();
24         tag = 0;
25         if( tmp % 2 ) tag ++;
26         tmp /= 2;
27         if( tag ) tmp ++;
28         a.push( tmp );
29     }
30     cout << a.top() << endl;
31 //    for(int i = 1;i < n;i ++)
32 //    {
33 //        cout << a[i] << " ";
34 //    }
35     
36 }
View Code

hack:有的区段三分即可


正解:二分寻找答案

 code:

再普通不过的二分:

int ef( int l , int r )
{
    if( l == r ) return l;
    int mid = ( l + r ) / 2;
    if( chck( mid ) )  return ef( l , mid );
    else return ef( mid + 1 , r );
}

检查函数:

bool chck( int len )
{
    int pn = K;//分割的剩余次数 
    for(int i = 2;i <= N;i ++)
    {
        int prt = a[i] - a[i-1];
        if( prt <= len ) continue;
        pn -= ( prt / len );
        if( prt % len ) pn --;
        pn ++;
        if( pn < 0 ) return 0;
    }
    return 1;
}

主函数部分:

signed main()
{
    cin >> L >> N >> K;
    for(int i = 1;i <= N;i ++) cin >> a[i];
    cout << ef( 0 , L ) << endl;
    return 0;    
} 

值得注意的是,遇到初始分个节点为 (0,2) 之类的情况,则无法二分,需要进行特判

if( l == 0 && r == 2 ) return ( l + 1 );

 


AC代码:

 1 #include <bits/stdc++.h>
 2 #define int long long
 3 
 4 using namespace std;
 5 
 6 int L , N , K;
 7 int a[1000010];
 8 
 9 bool chck( int len )
10 {
11 //    if( len == 0 )
12 //    {
13 //        return 1;
14 //    }
15     int pn = K;//分割的剩余次数 
16     for(int i = 2;i <= N;i ++)
17     {
18         int prt = a[i] - a[i-1];
19         if( prt <= len ) continue;
20         pn -= ( prt / len );
21         if( prt % len ) pn --;
22         pn ++;
23 //        cout << "pn= " << pn << endl;
24         if( pn < 0 ) return 0;
25     }
26     return 1;
27 }
28 
29 int ef( int l , int r )
30 {
31 //    cout << "l,r: " << l << " " << r << endl;
32     
33     if( l == r ) return l;
34     if( l == 0 && r == 2 ) return ( l + 1 );
35     
36     
37     int mid = ( l + r ) / 2;
38     
39     
40 //    cout << "mid: " << mid << endl;
41     
42     if( chck( mid ) ) //可以用 
43     {
44 //        cout << "状态: " << 1 << endl; 
45         return ef( l , mid );
46     }
47     else 
48     {
49 //        cout << "状态: " << 0 << endl; 
50         return ef( mid + 1 , r );
51     }
52 }
53 
54 signed main()
55 {
56     cin >> L >> N >> K;
57     a[0] = 0;
58     for(int i = 1;i <= N;i ++)
59     {
60         cin >> a[i];
61     }
62     a[N+1] = L;
63      
64     cout << ef( 0 , L ) << endl;
65     
66     return 0;    
67 } 
68 /*
69 
70 101 2 1
71 0 101
72 
73 2 2 1
74 0 2
75 
76 */
View Code

 

标签:tmp,二分,return,路标,题解,cin,int,tag,TJOI2007
From: https://www.cnblogs.com/coper/p/TJOJ2007_Roadsign_setting.html

相关文章

  • UVA11090 Going in Cycle!!题解
    题目大意给定一个N个点M条边的带权有向图,求平均值最小的回路。解法看到这种题目,喜欢打暴力的我一下就想到:遍历整个图,找到每一个环,然后算出它们的平均值,最后比较出最小值。然而,呃...,会T飞...既然我们不能暴力找最小值,那还有什么别的办法吗?我们只需要输出一个最小值就行了,既然......
  • 题解 P4108【[HEOI2015]公约数数列】
    看到这种奇怪的操作,首先想到分块。以下记值域为\(w\),块长为\(B\)。前缀\(\gcd\)显然单调不增,而且后一个必须是前一个的因数,如果变化至少要减半。因此,我们知道,共有\(\mathcalO(\logw)\)个不同的前缀\(\gcd\)。我们可以接受对这些块暴力,只需要对前缀\(\gcd\)都相同的块......
  • uni-app微信小程序路由传参数据截断问题解决
    跳转页面:因为数据接受页面是富文本编辑器接收,所以先是将数据双引号处理了。数据太多太长,跳转页面只要用encodeURIComponent()函数将其数据处理后传过去constdetails=this.oneform.text.replace(/"/g,'\'')this.$tab.navigateTo(`/pages/common/editor/editor?details=${e......
  • 我是如何写题解的
    在算法竞赛中,写题解是我们不可或缺的一部分。它不仅能够帮助我们整理思路、总结经验,还可以与他人分享我们的解题思路和代码实现。然而,写一篇较完备的题解往往非常繁琐,需要手动复制粘贴题目链接、题号和AC代码,这不仅费时费力,还容易分散我们的注意力,因为我们写题解的核心内容是对题......
  • 【问题解决】 网关代理Nginx 301暴露自身端口号
    一般项目上常用Nginx做负载均衡和静态资源服务器,本案例中项目上使用Nginx作为静态资源服务器出现了很奇怪的现象,我们一起来看看。“诡异”的现象部署架构如下图,Nginx作为静态资源服务器监听8080端口,客户浏览器通过API网关的443端口(就是https)获取Nginx静态资源。现象是用户浏览......
  • react经典面试题解析--持续更新--day02
    二十一、高阶组件的使用场景1、数据获取:高阶组件可以在组件挂载时自动获取数据,并将数据通过props传递给被包装组件。2、权限控制:高阶组件可以检查用户是否有访问该组件的权限,从而决定是否渲染该组件。3、代码重用:高阶组件可以通过封装一些常见的逻辑,来提高代码的复用性。4、......
  • VONE客户端常见问题解决方案
    一、连接服务器失败打开vone客户端时,提示“连接服务器失败,请确认网络连接是否正常”,如下图:![image](https://img2023.cnblogs.com/blog/1224277/202306/1224277-20230620102849617-1673950342.png)![image](https://img2023.cnblogs.com/blog/1224277/202306/1224277-20230......
  • 题解 CF1840D【Wooden Toy Festival】
    不妨设\(a\)单调递增(无重复),显然如果\(n\le3\)答案就是\(0\)。显然答案\(k\)具有可二分性。也就是说,当\(k<k_0\)时一定不存在合法的\(x,y,z\),当\(k\gek_0\)时一定存在,\(k_0\)就是答案。因此二分答案,只需要验证答案\(k\)是否存在合法的\(x,y,z\)。为了覆盖到......
  • Codeforces Round 879 (Div. 2) 题解
    寄!大!了!Rating-=124.(恼)https://codeforces.com/contest/1834C.GamewithReversing发现\(\text{rev}(S)\toS\)和\(\text{rev}(T)\toT\)本质上是一样的。赛时就一个劲的对着\(S\)操作,,,。我们考虑单点修改在\(S\)上做,翻转操作在\(T\)上做。设\(\displaysty......
  • [ABC216G] 01Sequence 题解
    01Sequence题目大意构造一个满足\(m\)个形如\((l,r,x)\)的限制条件的\(01\)序列,其中\((l,r,x)\)表示区间\([l,r]\)的和不小于\(x\),你需要保证序列中\(1\)的个数最小。思路分析贪心的想,如果我们将限制按右端点排序,那么当遍历到一个区间,发现现有的和不满足限制条件......