BUPT OJ180 大牛们的午饭

2023-10-28 22:33
文章标签 大牛们 bupt oj180 午饭

本文主要是介绍BUPT OJ180 大牛们的午饭,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

大家都知道ACM比赛有提供午饭的传统,正好最近学校要举办程序设计竞赛,可是ACM大牛们都去打比赛去了.只剩下弱菜Saerdna一个人负责大牛们的午饭.因为负责送那么多大牛的午饭是一件很累的活,所以Saerdna当然希望每位大牛都吃得少一点,最好都不吃。。。。但是不送午饭又说不过去,所以对于每个大牛,Saerdna都会送去一份午饭。
因为每个大牛都有一个大牛值,所以大牛之间都会暗自较劲,为了不让大牛们起冲突,Saerdna送去的午饭必需保证相邻两个大牛之间存在以下关系,大牛值大的大牛得到的午饭比大牛值小的大牛要多。

输入格式

一开始是一个数字T(T<=10)表示数据组数
接下来T行,每行是一个数n.(n<=10^6)
接下来一行有n个数,表示每个大牛的大牛值。

输出格式

Saerdna最少需要送多少饭。

输入样例

2
3
1 2 3
4
3 1 2 2

输出样例

6
6

热身赛的题, 从前往后扫一遍, 从后往前扫一遍, 然后取最大值. 时空复杂度均为O(N)

证明很简单, 即从一个方向扫可以得到所有此方向递增的序列, 并且扫得结果满足左邻居/右邻居所需条件的最小值 所以扫两次后所得最大值即是最小同时满足左右邻居的(午饭)值

这题和以前在leetcode上做过的某道candy几乎一模一样,可以实现O(N)时间和O(1)空间, 而且可以实现只扫一遍得出结果. 反正只要过了就行, 这个方法以后再讨论吧



/*
USER_ID: test#birdstorm
PROBLEM: 180
SUBMISSION_TIME: 2014-03-08 01:00:03
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAX(x,y) (x)>(y)?(x):(y)
#define For(i,m,n) for(i=m;i<n;i++)int a[1000005], b[1000005], c[1000005];main()
{int t, n, i, j, sum, x;scanf("%d",&t);while(t--){scanf("%d",&n); sum=0;For(i,0,n) b[i]=c[i]=1;For(i,0,n) scanf("%d",&a[i]);For(i,1,n){if(a[i-1]<a[i]) b[i]=b[i-1]+1;else b[i]=1;}for(i=n-2;i>=0;i--){if(a[i+1]<a[i]) c[i]=c[i+1]+1;else c[i]=1;}For(i,0,n) sum+=MAX(b[i],c[i]);printf("%d\n",sum);}return 0;
}


================更新: (2014/03/17)================

这两天有同学问我这题, 于是又看了一遍, 然后模仿leetcode上提到的做法重写了一个O(N)时间 O(1)空间的代码

主要是学习了这种只扫描一遍以及不额外分配空间的方法, 还是收获很大的.

此方法可以只需要得知当前项和前一项就能推出当前午餐值, 而不必存储整个序列. 

主体思路是: 

读入当前项后进行以下操作和判断

1)严格单调下降: 存储除峰值外当前严格单调下降序列长度以及峰值时的午餐值, 此严格下降单调序列所有午餐值+1.

要注意当峰值与此序列长度相等时, 需要扩充序列长度, 把峰值也包含进单调下降序列, 整个序列午餐值全部+1.

2)严格单调上升: 只需要令当前项的午餐值是前一项的午餐值+1即可.

3)当前项与前一项的午餐值相等时, 则当前项午餐值=1.

这样写出的代码也如同思路一样, 简洁易懂.



/*
USER_ID: test#birdstorm
PROBLEM: 180
SUBMISSION_TIME: 2014-03-17 16:59:00
*/
#include <stdio.h>
#define For(i,m,n) for(i=(m);i<(n);i++)main()
{int i, n, t, now, prev, nCnt;int nSeqLen, nPreCnt, nMaxCntInSeq;scanf("%d", &t);while(t--){scanf("%d%d", &n, &prev);nCnt=1; nSeqLen = 0; nMaxCntInSeq = nPreCnt = 1;For(i,1,n){scanf("%d", &now);if(now < prev){nSeqLen++;if(nMaxCntInSeq == nSeqLen) nSeqLen++;nCnt+= nSeqLen;nPreCnt = 1;}else{if(now > prev) nPreCnt++;else nPreCnt = 1;nCnt += nPreCnt;nSeqLen = 0;nMaxCntInSeq = nPreCnt;}prev=now;}printf("%d\n",nCnt);}return 0;
}


这篇关于BUPT OJ180 大牛们的午饭的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/296406

相关文章

BUPT-SUMMER-TRAINING-搜索

比赛地址 A - Sticks 剪枝: 1、  由于所有原始棒子等长,那么必有sumlen % Initlen==0; 2、  若能在[maxlen,sumlen-InitLen]找到最短的InitLen,该InitLen必也是[maxlen,sumlen]的最短;若不能在[maxlen,sumlen-InitLen]找到最短的InitLen,则必有InitLen=sum

Android开发大牛们的博客地址

---------------比较好的博客地址------------------------------------------------------------------- 1 谦虚的天下:http://www.cnblogs.com/qianxudetianxia/ 2 csdn博文精选:http://www.csdn.net/article/2011-08-30/303833  备

短视频 - 程序大牛们的大学时光

视频中的第一位大牛蛮有个性!他对百度一直是另眼相看,就连自己的博客网站——酷壳网也屏蔽了百度的爬虫。 他就是陈皓,曾在阿里巴巴北京研发中心、商家业务部曾任资深专家一职,负责电商云平台、开放平台,云监控和电商多媒体平台。曾在阿里巴巴核心系统专家组从事阿里核心系统和阿里云ECS相关的虚拟化平台的开发工作。现在创业中,MegaEase创始人,致力于为企业的高并发高可用架构提供一整套的技术解决

大牛们帮我看看kali 源更新问题 谢谢!

root@kali:~# gedit /etc/apt/sources.list root@kali:~# apt-get update && apt-get upgrade && apt-get dist-upgrade 获取:1 http://mirrors.ustc.edu.cn/kali kali-rolling InRelease [30.5 kB] 获取:3 http://mirror

HDU 6083 度度熊的午饭时光 (多限制0/1背包)

度度熊的午饭时光                                                            Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

树形结构 | 北邮机试 | bupt oj | 91. 文件系统

文件系统 时间限制 1000 ms 内存限制 65536 KB 题目描述 现在很多操作系统的文件系统都是基于树形结构设计的。即一个目录下可以有若干个目录和文件,而每个目录和文件都可以通过一条从根目录出发的唯一路径来唯一确定。我们希望你实现对这样的一个文件系统的简单管理。 为了简化问题,我们做出如下假设: 假设文件系统初始时只有一个根目录root。 假设所有出现的文件和目录的名字都是唯一的。即

北邮机试 | bupt oj | Python List 0273

题目链接: https://blog.csdn.net/TQCAI666/article/details/86767987?tdsourcetag=s_pctim_aiomsg#Problem_D_Python_List_399 题目描述 在Python中,List (列表)是一种非常重要的数据结构。它与C/C++/Java中的数组有些类似,但支持添加新元素时的动态扩展。在这个问题中,你需

北邮机试 | bupt oj | 字符串转换

字符串转换 时间限制 1000 ms 内存限制 65536 KB 题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而"abcd"则不是简单串。现在给你一个仅由小写字母组成的字符串,你需要用最小的花费,将其转换成一个简单串。 花费的计算规则如下:将a到z这26个小写字母从左到右排成一排,则每个字母都有左右两个邻居,我们认为a的左邻居是z,z的右邻居

北邮机试 | bupt oj | 最值问题

最值问题 时间限制 1000 ms 内存限制 65536 KB 题目描述 给出N个数,求出这N个数中最大值和次大值。注意这里的次大值必须严格小于最大值。输入保证N个数中至少存在两个不同的数。 输入格式 第一行为测试数据的组数T(T≤20)。请注意,任意两组测试数据之间是相互独立的。 每组数据包括两行: 第一行为一个整数N(1≤N≤1000)。 第二行为N个正整数,每个整数均不大于106。

北邮机试 | bupt oj | 日期

日期 时间限制 1000 ms 内存限制 65536 KB 题目描述 请你计算出第X年Y月Z日是第X年的第几天。其中,1月1日是第一天,1月2日是第二天,以此类推。 计算时请注意闰年的影响。对于非整百年,年数能整除4是闰年,否则不是闰年;对于整百年,年数能整除400是闰年,否则不是闰年。如1900年和1901年不是闰年,而2000年和2004年是闰年。 输入格式 第一行有一个整数T (