• J


    给定序列A={A1,A2,...,An}A={A1,A2,...,An}, 要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:Bi<Bi+1,1i<NBi<Bi+1,1≤i<N)。 

    我们定义从序列A到序列B变换的代价为cost(A,B)=max(|AiBi|)(1iN)cost(A,B)=max(|Ai−Bi|)(1≤i≤N)。 

    请求出满足条件的最小代价。 

    注意,每个元素在变换前后都是整数。

    Input第一行为测试的组数T(1T10)T(1≤T≤10)

    对于每一组: 
    第一行为序列A的长度N(1N105)N(1≤N≤105),第二行包含N个数,A1,A2,...,AnA1,A2,...,An
    序列A中的每个元素的值是正整数且不超过106106。Output对于每一个测试样例,输出两行: 

    第一行输出:"Case #i:"。i代表第 i 组测试数据。 

    第二行输出一个正整数,代表满足条件的最小代价。Sample Input

    2
    2
    1 10
    3
    2 5 4

    Sample Output

    Case #1:
    0
    Case #2:
    1

    题目简单直接上代码

    代码

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn = (int)1e5+5;
    int xl[maxn],n;
    int check(int mid)
    {
    	int prevv = xl[0] - mid; 
    	for(int i = 1;i<n;i++)
    	{
    		if(prevv >=xl[i] + mid) return 0;
    		else if(xl[i] - mid> prevv) {
    			prevv = xl[i] - mid;
    		}
    		else prevv++;
    	}
    	return 1;
    }
    int main()
    {
    	int ncase = 1;
    	int t;
    	cin>>t;
    	while(t--)
    	{
    		cin>>n;
    		for(int i = 0;i<n;i++)
    		{
    			scanf("%d",&xl[i]);
    		}
    		int low = 0,high = 1000000,mid;
    		while(low <= high)
    		{
    			mid = (low + high)/2;
    			if(check(mid)) high = mid-1;
    			else low = mid+1;
    		}
    		printf("Case #%d:
    ",ncase++);
    		printf("%d
    ",low);
    	}
    	return 0;
    } 


  • 相关阅读:
    python读写操作(txt, mat, xls, etc文件)
    开发linux版QQ就是支持未来的国产操作系统
    为知笔记linux绿色版的快速调用
    数学物理中的常见误区
    markdown语法小结
    信息爆炸时代的知识获取
    matlab: 数据的读写
    APS期刊投稿准备: REVTex格式
    markdown基本语法
    常见的数学关系
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11746051.html
Copyright © 2020-2023  润新知