首页 > 其他分享 >P3131 [USACO16JAN] Subsequences Summing to Sevens S

P3131 [USACO16JAN] Subsequences Summing to Sevens S

时间:2024-07-26 19:28:55浏览次数:13  
标签:Sevens group 前缀 int sum Summing Subsequences 数组 cows

传送锚点:

[USACO16JAN]Subsequences Summing to Sevens S - 洛谷

题目描述

Farmer John's \(N\) cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to take a photo of a contiguous group of cows but, due to a traumatic childhood incident involving the numbers \(1 \ldots 6\), he only wants to take a picture of a group of cows if their IDs add up to a multiple of 7.

Please help FJ determine the size of the largest group he can photograph.

给你n个数,分别是a[1],a[2],...,a[n]。求一个最长的区间[x,y],使得区间中的数(a[x],a[x+1],a[x+2],...,a[y-1],a[y])的和能被7整除。输出区间长度。若没有符合要求的区间,输出0。

输入格式

The first line of input contains \(N\) (\(1 \leq N \leq 50,000\)). The next \(N\)

lines each contain the \(N\) integer IDs of the cows (all are in the range

\(0 \ldots 1,000,000\)).

输出格式

Please output the number of cows in the largest consecutive group whose IDs sum

to a multiple of 7. If no such group exists, output 0.

样例 #1

样例输入 #1

7
3
5
1
6
2
14
10

样例输出 #1

5

提示

In this example, 5+1+6+2+14 = 28.

思路

这题结合前缀和和数学知识,我一开始的想法是算出前缀和存储到一个数组,使用二重循环求出最大能被余7的连续个数,但样例点有5万个,会超时

首先我们要对前缀和加上第i个数字都进行模7处理,然后用到一个小定理,若两个数相减 (mod 7=0) ,那么这两个数 mod 7 的余数一定相同!

然后我们回想一下我们是怎么求一维数组下的一段前缀和,是不是用sum[r] - sum[l - 1](sum为存储前缀和),所以我们引入l、r两个数组,数组大小都为7,

l[i]存%7为i的最小值l- 1,r[i]存%7为i的最大值r,-1代表没有%7为i的前缀和,注意l数组中第一个值初始化为0,因为当任意前缀和sum[x]%7等于0时,最长区间就是x

code

#include <iostream>

using namespace std;
int main() {
    int n;
    cin >> n;
    int l[7], r[7];//余数
    fill(l, l + 7, -1);
    fill(r, r + 7, 0);
    l[0] = 0;
    int sum = 0;//前缀和
    for (int i = 1; i <= n; ++i) {
        int a;
        cin >> a;
        sum = (sum + a) % 7;
        if (l[sum] == -1) l[sum] = i;
        r[sum] = i;
    }
    int ans = 0;
    for (int i = 0; i < 7; ++i) {
        if (l[i] != -1) {
            ans = max(r[i] - l[i], ans);
        }
    }
    cout << ans;
    return 0;
}

标签:Sevens,group,前缀,int,sum,Summing,Subsequences,数组,cows
From: https://www.cnblogs.com/6Luffy6/p/18326086

相关文章

  • [ABC362E]Count Arithmetic Subsequences
    题目大意给定\(N\)个数字的序列,每个元素为\(a[i]\),问长度为i的数字序列是由多少个子序列构成的?定义数字序列:如果\(a[i]-a[j]==a[k]-a[i]\),则\(a[j],a[i],a[k]\)构成数字序列数据范围\(N\leq80,a_i\leq10^9\)题解一看到这个数据范围,就和\(a[i]\)没关系,肯定是和\(N\)有......
  • 题解:CodeForces 843A Sorting by Subsequences[模拟/排序]
    CodeForces843AA.SortingbySubsequencestimelimitpertest:1secondmemorylimitpertest:256megabytesinputstandardinputoutputstandardoutputYouaregivenasequence\(a_1, a_2, ..., a_n\)consistingofdifferentintegers.Itisrequiredtos......
  • [491] Non-decreasing Subsequences
    算法助手用户:这个题目有什么好的思路吗?“Givenanintegerarraynums,returnallthedifferentpossiblenon-decreasingsubsequencesofthegivenarraywithatleasttwoelements.Youmayreturntheanswerinanyorder.”我的代码是这样的:/**@lcapp=leetcod......
  • CF1924D Balanced Subsequences 题解
    先判掉\(k>\min(n,m)\)的情况。首先有个明显的计算最长合法括号子序列的贪心方法:初始一个值为\(0\)的计数器,从左到右枚举每个字符,遇到(时将计数器加一,遇到)时如果计数器不为\(0\)就减一然后将答案加一。考虑绘制它的折线图。初始时纵坐标为\(0\),从左到右枚举每个字符......
  • CF1922E Increasing Subsequences
    一个显然的思路就是构造很多互不相关的上升序列。但是这样构造出来的\(n\)是\(O(\log_2^2n)\)量级的,所以需要考虑新做法。假设我们本来有一个上升序列,我们能否往里面插数?如果插入的数前面本来有\(x\)个数,那么它有\(2^x\)的贡献。于是容易想到先写一个最大的上升序列,再二......
  • E. Increasing Subsequences__2
    原题链接题解已知对于一个长度为\(n\)的连续+1型上升序列而言,其满足要求的子序列有\(2^n\)个若我们在该序列下标为\(k\)的右边插入一个绝对大于左边,绝对小于右边的数,满足要求的子序列会增加\(2^k\)个由此想到极限构造加二进制,其中最高位的一不用管,其余的每一位生成上升......
  • CF1922E Increasing Subsequences 题解
    解题思路因为可以有空集,那么我们首先构造第一段最长的连续上升的序列,那么这段序列中共有\(2^{\mids\mid}\)个上升子序列。接下来我们考虑补全剩余的,我们不妨将剩余的部分全部设为连续不增序列,那么设当前位置在第一段中有\(k\)个小于它的,那么添加这个数后可以增加\(2^{k-1}......
  • CF1924D Balanced Subsequences
    题意简述有\(n\)个左括号和\(m\)个右括号,求最长合法括号子序列长度为\(2k\)的括号序列的数量,对\(10^9+7\)取模。多组数据。\(T\le3\times10^3,n,m,k\le2\times10^3\)分析可能需要的前置知识:如何求一个字符串的最长合法括号子序列?维护一个括号栈,若遇到左括号则直接......
  • CodeForces 1924D Balanced Subsequences
    洛谷传送门CF传送门发现去掉匹配的\(2k\)个括号后,剩下的串一定形如\())\ldots)((\ldots(\),其中右括号数量为\(a=m-k\),左括号数量为\(b=n-k\)。考虑把剩下的串像\())\ldots)\mid((\ldots(\)一样分成两半。枚举左半边加入了\(\frac{i}{2}\)对匹配,则......
  • CF1621G Weighted Increasing Subsequences
    CF1621GWeightedIncreasingSubsequences你有一个长度为\(n\)的序列,定义\(a\)的一个长度为\(k\)的子序列为\(a_{i_1},a_{i_2},\dots,a_{i_k}\)。由此,我们不难发现,\(a\)的一个长度为\(k\)的子序列为上升子序列,当且仅当\(\forallj\in[1,k)\),\(a_{i_j}<a_{i_{j+1}}\)......