首页 > 编程语言 >武汉工程大学第五届程序设计新生赛 I题 题解

武汉工程大学第五届程序设计新生赛 I题 题解

时间:2023-01-01 15:11:08浏览次数:61  
标签:颜色 int 题解 最小 一位 次数 程序设计 第五届 define

(2022,12,3)

原题链接(来自牛客竞赛)

抽象题意

题目有点长,我们需要抽象出一个模型:

一个长度为\(n\)的序列\(a_i\),从\(a_1\)开始向后跳,每次可以从\(a_i\)跳到下一位\(a_{i+1}\),或者跳到与\(a_i\)相同数字的任何一位。求跳到最后一位\(a_n\)所需的最小次数。

思路

为了方便我们记每一位的数字称为该位的颜色

从抽象出的模型可以看出,每一位所需的次数,即为跳到前一位所需次数与跳到同颜色所需最小次数之间的最小值,再加一

那我们用一个数组\(tim[i]\)记录每一位所需最小次数,以及每种颜色所需次数最小的位置\(col[i]\)(不直接记次数是因为第一次扫到这个颜色的时候,不知道这个跳到这里所需的次数为多少)

但是我们从前往后扫的话,实际上跳到同颜色所需次数最小的一位有可能在这一位的后面,我们怎么办呢,可以一直扫,直到每一位都确定下来,没有再更改为止

代码

#include<bits/stdc++.h>
#define MAXn 1000001
#define MAXk 110
#define inf 200000000
using namespace std;

int n;
int a[MAXn];
int tim[MAXn];//每位所需次数
int col[MAXk];//走到颜色i次数最小的位置 

inline int minn(int x, int y)//手写min函数,更快 
{
	if(x < y)
		return x;
	else return y;
}

int main()
{
	scanf("%d", &n);
	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
		tim[i] = inf;
	}
	
	tim[1] = 0;
	col[a[1]] = 1;
	bool if_do = 1;
	while(if_do)//一直去刷新看什么时候没有更改 
	{
		if_do = 0;
		for(int i = 2; i <= n; i++)//第一位肯定是确定的,从第二位开始 
		{
			int tmp = tim[i];//先存下这个数,等会看看有没有被更改 
			if(col[ a[i] ])//如果这个颜色走过
				tim[i] = tim[ col[ a[i] ] ] + 1;//先假设,这一位的最小次数,是由同颜色次数最小的一个位置跳过来的
			else col[ a[i] ] = i;//第一次出现,那他应该是当前该颜色所需次数最小的 一位
			tim[i] = minn( tim[i - 1] + 1, tim[i] );//看看从上一位走来是不是更快 
			if(tim[i] < tim[ col[ a[i] ] ]) //如果这一位所需的次数,比这一位颜色所需的最小,更新
				col[ a[i] ] = i; 
			if(tmp != tim[i]) 
				if_do = 1;//更新了继续做 
		}
	}
	printf("%d", tim[n]);
	
	return 0; 
}

标签:颜色,int,题解,最小,一位,次数,程序设计,第五届,define
From: https://www.cnblogs.com/six-one/p/17018092.html

相关文章

  • 网络程序设计 实验3 多人聊天室 流式套接字 多线程编程
    实验3多人聊天室实验目的:通过流式套接字编程,及多线程编程,实现简单的多人聊天室。开发语言与工具:VC实验要求:1.使用MFC编程。2.利用流式套接字编程及多线程编程。3......
  • 洛谷P4146 序列终结者 题解 splay tree
    题目链接:​​https://www.luogu.com.cn/problem/P4146​​题目大意:支持:区间更新(+x)区间翻转区间查询(最大值)解题思路:几乎和​​AcWing2437.Splay​​这题一模一样。示例程......
  • CF1770D Koxia and Game 题解
    47min时过C降智50min做不出D。果然晚上容易降智。题意不想复述,好长。linktoCF|linktoLuogu合理猜测留给后手的两个数字必须相等。证明为若不相等,则后手可以......
  • 洛谷 P2395 BBCode转换Markdown 题解
    洛谷P2395BBCode转换Markdown题解题目传送门:here.一道毒瘤的大模拟,给了你一部分的BBCode和Markdown语法,叫你转换。如下表:BBCodeMarkdown[h1]文字[/h1......
  • Codeforces Good Bye 2022 CF 1770 A~E 题解
    题目链接A.KoxiaandWhiteboards注意每一步替换操作都是强制的,而不是可选的。所以就用一个multiset维护所有的数,每次选一个最小的替换掉即可。时间复杂度\(O(nlogn)\)......
  • P4247 [清华集训2012]序列操作 题解
    线段树练手好题。直接上线段树五问:维护的信息是什么?由于\(c\le20\),我们不妨对线段树的每个节点维护一个\(f_k\)表示在对应区间里选择\(k\)个数相乘的所有方案的和......
  • 题解 CF1770B【Koxia and Permutation】
    \(k=1\)的情况是平凡的。\(k>1\)的情况,显然答案至少为\(n+1\),下面给出构造证明\(n+1\)总可以取到。可以构造\(p=[n,1,n-1,2,n-2,3,\cdots]\),此时以\(n\)作为最......
  • 题解 CF1770C【Koxia and Number Theory】
    显然,如果存在\(a_i=a_j\),则一定无解。否则,考虑每一个\(2\sim50\)的正整数\(k\),如果原数组每个数对\(k\)取模后,每种余数都出现至少两次,则无解。因为此时无论如何选......
  • 【题解】P5574 [CmdOI2019]任务分配问题
    stocmd学长orz题意P5574[CmdOI2019]任务分配问题给定一个长度为\(n\)的排列,试将它分成\(k\)段,使得每段的顺序对数量之和最小。\(n\leq2.5\times10^4,k\l......
  • 【题解】P1912 [NOI2009] 诗人小G
    题意多测。给定\(n\)个字符串和一个常数\(L\),试将这些字符串分成若干组,使得:令\(len(i)\)为第\(i\)个字符串的长度,则每组字符串的\(|\sum\limitslen(i)-L|\)......