1402 最大值(模拟)

    xiaoxiao2021-03-25  87

    1402 最大值 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 一个N长的数组s,满足以下性质: 1)每个元素都是非负的整数,且s[1]=0; 2)任意两个相邻元素差值的绝对值不大于1,即| s[i]-s[i+1] |<=1; 3)对于部分特殊点xi,要求s[xi]<=ti(这样的特殊点一共M个); 问在以上约束下s[]中的最大值最大可能是多少? Input 多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5 每组测试数据有相同的结构构成: 第一行两个整数N,M,表示s[]的长度与特殊点的个数,其中1<=N<=100000,0<=M<=50. 之后M行,每行两个整数xi与ti,其中1<=xi<=N,0<=ti<=100000,且xi以增序给出。 Output 每组数据一行输出,即数组的可能最大值。 Input示例 3 10 2 3 1 8 1 100000 0 2718 5 1 100000 30 100000 400 100000 1300 100000 2500 100000 Output示例 3 99999 2717 题解:找到每一个临界点,做一条斜率为1和-1的直线,对比取最小

    #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define M 100010 int a[M]; int main() { int n, m, xi, ti, temp, t; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); for(int i=1; i<=n; i++) { a[i] = i-1; } for(int i=0; i<m; i++) { scanf("%d%d", &xi, &ti); temp = xi; while(temp <= n) { if(temp-xi+ti < a[temp]) { a[temp] = temp-xi+ti; } temp++; } temp = xi; while(temp >= 1) { if(xi-temp+ti < a[temp]) { a[temp] = xi-temp+ti; } temp--; } } int ans = 0; for(int i=1; i<=n; i++) { ans = max(ans, a[i]); } printf("%d\n", ans); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-14080.html

    最新回复(0)