首页 > 其他分享 >P1091 [NOIP2004 提高组] 合唱队形

P1091 [NOIP2004 提高组] 合唱队形

时间:2024-09-12 20:51:24浏览次数:1  
标签:NOIP2004 同学 le 合唱队 int 样例 P1091 ans

[NOIP2004 提高组] 合唱队形

题目描述

$n$ 位同学站成一排,音乐老师要请其中的 $n-k$ 位同学出列,使得剩下的 $k$ 位同学排成合唱队形。

合唱队形是指这样的一种队形:设 $k$ 位同学从左到右依次编号为 $1,2,$ … $,k$,他们的身高分别为 $t_1,t_2,$ … $,t_k$,则他们的身高满足 $t_1< \cdots <t_i>t_{i+1}>$ … $>t_k(1\le i\le k)$。

你的任务是,已知所有 $n$ 位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入格式

共二行。

第一行是一个整数 $n$($2\le n\le100$),表示同学的总数。

第二行有 $n$ 个整数,用空格分隔,第 $i$ 个整数 $t_i$($130\le t_i\le230$)是第 $i$ 位同学的身高(厘米)。

输出格式

一个整数,最少需要几位同学出列。

样例 #1

样例输入 #1

8
186 186 150 200 160 130 197 220

样例输出 #1

4

提示

对于 $50%$ 的数据,保证有 $n \le 20$。

对于全部的数据,保证有 $n \le 100$。


算法1

(动态规划)

1.状态定义

f[i]: 包括我,我左边比我矮的人数
g[i]: 包括我,我右边比我爱的人数

2.状态计算

(1) 从左往右扫描,枚举每一个位置,看我左边有多少个数比我小

(2) 从右往左扫描,枚举每一个位置,看我右边有多少个数比我小

(3)统计每个位置作为中间点时,剩余的人数;

(4)取最大人数 ,最后答案为 n - ans;

也就是说,剩余的人越多,出列的人越少

C++ 代码

#include <bits/stdc++.h>
using namespace std;

const int N = 110;

int n;
int a[N];
int f[N],g[N],s[N],ans;

int main() {
	scanf("%d",&n);
	for(int i = 1; i <= n; i++) {
		scanf("%d",&a[i]);
		f[i] = 1;
		g[i] = 1;
	}

	for(int i = 2; i <= n; i++) {
		for(int j = 1; j < i; j ++) {
			if(a[i] > a[j] && f[i] <= f[j] + 1)
				f[i] = f[j] + 1;
		}
	}

	for(int i = n - 1; i >= 1; i--) {
		for(int j = i + 1; j <= n; j++) {
			if(a[i] > a[j] && g[i] <= g[j] + 1)
				g[i] = g[j] + 1;
		}
	}

	for(int i = 1; i <= n; i++) {
		s[i] = g[i] + f[i] - 1;
		if(s[i] > ans) ans = s[i];
	}
	printf("%d" ,n - ans);
	return 0;
}

标签:NOIP2004,同学,le,合唱队,int,样例,P1091,ans
From: https://www.cnblogs.com/ltphy-/p/18411077

相关文章

  • P1087 [NOIP2004 普及组] FBI 树
    大家好!下面为大家讲解我做了两年半的题目,[NOIP2004普及组]FBI树题目描述我们可以把由0和1组成的字符串分为三类:全0串称为B串,全1串称为I串,既含0又含1的串则称为F串。FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为......
  • Solution - Luogu P10918 小分图最大匹配
    首先考虑连边的情况。可以把\(a_i\)拆成\(\gcd(a_i,m)\times\frac{a_i}{\gcd(a_i,m)}\),因为\(\gcd(\frac{a_i}{\gcd(a_i,m)},m)=1\),所以与\(a_i\)有连边的\(j\)一定满足\(j\bmod\gcd(a_i,m)=0\)。于是就可以把\(c_{a_i}\)放到\(c_{\gcd(a_i,m)}\),左部点......
  • P1091 [NOIP2004 提高组] 合唱队形
    这道题主要考察的是线性dp,最基础的dp,这道题的主要思路1.求出最大子序列,2.求出最小子序列,3.找出最少要多少个人要出列。其实我们主要2可以变成逆序查找最大子序列,所以我们只需要把前两个找出来之后我们就可以求出主要3(注意一定要减1,因为中间的那个同学一定会被多算一次所以必......
  • [NOIP2004 提高组] 虫食算(含代码)
    [NOIP2004提高组]虫食算题目描述所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的数字。来看一个简单的例子:43#9865#045......
  • 【c++提高组】津津的储蓄计划(NOIP2004)
    题目描述津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20%还给津津。因此津津制定了一个储蓄计划:每个月的......
  • CSP历年复赛题-P1087 [NOIP2004 普及组] FBI 树
    原题链接:https://www.luogu.com.cn/problem/P1087题意解读:字符串作为根,左边一半作为左子树,右边一半作为右子树,递归构造数,并按FBI规则输出后续遍历结果。解题思路:按照题意,通过dfs来构造树,对于字符串str,提取左边一半递归构造左子树,提取右边一半递归构造右子树,前提是字符串长度>1......
  • CSP历年复赛题-P1085 [NOIP2004 普及组] 不高兴的津津
    原题链接:https://www.luogu.com.cn/problem/P1085题意解读:找到两数之和大于8且两数之和最大值的位置解题思路:不多说,送分题,直接模拟法即可100分代码:#include<bits/stdc++.h>usingnamespacestd;inta,b;intmaxx,maxn;intmain(){for(inti=1;i<=7;i++)......
  • 洛谷题单指南-动态规划3-P3205 [HNOI2010] 合唱队
    原题链接:https://www.luogu.com.cn/problem/P3205题意解读:给定理想队形,计算初始队形的方案数。解题思路:对于给定理想队形,最后一个人插入有两种可能:从左边插入、从右边插入从左边插入,则意味着前一个数比当前数大,前一个数有可能在左边也有可能在右边从右边插入,则意味着前一个数......
  • 洛谷题单指南-动态规划2-P1091 [NOIP2004 提高组] 合唱队形
    原题链接:https://www.luogu.com.cn/problem/P1091题意解读:要挑选一个最长的先上升后下降的序列,求其余的元素数量解题思路:先计算正向的最长上升子序列,设f[i]表示以i结尾的正向最长上升子序列再计算逆向的最长上升子序列,设g[i]表示以i结尾的逆向最长上升子序列再枚举所有的i<j,m......
  • 洛谷题单指南-贪心-P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
    原题链接:https://www.luogu.com.cn/problem/P1090题意解读:两两合并,是典型的哈夫曼编码算法思想,贪心即可。解题思路:要是合并体力消耗最少,就要让尽可能少的果子越晚合并越好,因此,贪心策略为优先选择数量最少的两堆果子合并,一直到剩下一堆果子,把合并过程中的消耗值累加即可,要快速......