Codeforces Round #649 (Div. 2) A题和B题

时隔8年再做codeforces,没敢参加比赛,就随便做着玩玩。

我codeforces的积分还停留在八年前,1693.希望不远的将来,能涨一些吧。

A题链接见

https://codeforces.com/contest/1364/problem/A

题目大意是:给n个数,找出这n个数的最长字串,使得它们的和能不被x整除,输出子串的长度,如果不存在这样的子串,输出-1.

题目比较简单,算法如下:

保存每个数模n的值和这n个数的和sum。如果值都是0,输出-1,如果sum不能被x整除,输出n.如果sum能被x整除的话。想象一下我们要做什么。假设n个数下标为1到n,我们从1开始从左向右找,找到第一个不能被x整除的数,假设下标为m1,再从n开始从右向左找,找到第一个不能被x整除的数,假设下标为m2,那么,答案就是max(n - m1, m2 -1)。

值得一提的是,这道题居然花了我两个小时,最后还是看了别人的代码才过的。这可是div2的A题啊,也就是说,这是给学生时代的我做,估计最多10分钟就能秒杀的级别。可见这些年我退化了多少,哎。

B题链接见

https://codeforces.com/contest/1364/problem/B

大意是,有n个数,取值为1到n,顺序随机。从这里面找出一个长度为k的子序列,满足以下条件:

1.

的值最大

2. 满足1的前提下,k的值越小越好。

输出子序列的长度和子序列的每一项,如果答案有多个,随便挑一种可能输出。

算法如下:

假设n个数的下标为1到n,第1个和第n个是一定要放到序列里的,然后,从第2个数开始。取有这样特点的数:假设数的下标为i,i-1到i是增加,i到i+1是减少。或者i-1到i是减少,i到i+1是增加。总之就是两端变化趋势不同的数。最后这些数组成的序列就是答案。

这题情况好一些,一次通过,没看别人的代码。

 

你可能感兴趣的:(codeforces)