首页 > 其他分享 >51nod-1624 取余最长路

51nod-1624 取余最长路

时间:2023-06-12 18:01:49浏览次数:55  
标签:佳佳 1624 51nod sum 矩阵 int num 取余 include


原题链接



1624 取余最长路



基准时间限制:1 秒 空间限制:131072 KB 分值: 40  难度:4级算法题



 收藏

 关注

佳佳有一个n*m的带权矩阵,她想从(1,1)出发走到(n,m)且只能往右往下移动,她能得到的娱乐值为所经过的位置的权的总和。

有一天,她被下了恶毒的诅咒,这个诅咒的作用是将她的娱乐值变为对p取模后的值,这让佳佳十分的不开心,因为她无法找到一条能使她得到最大娱乐值的路径了!

她发现这个问题实在是太困难了,既然这样,那就只在3*n的矩阵内进行游戏吧!

现在的问题是,在一个3*n的带权矩阵中,从(1,1)走到(3,n),只能往右往下移动,问在模p意义下的移动过程中的权总和最大是多少。


样例解释:


移动的方案为“下下右”。



Input


单组测试数据第一行两个数n(1<=n<=100000),p(1<=p<=1000000000)。接下来3行,每行n个数,第i行第j列表示a[i][j]表示该点的权(0<=a[i][j]<p)。


Output


一个整数表示答案。


Input示例


2 32 22 20 1


Output示例


2



num数组代表矩阵, sum数组代表num数组每一维的前缀和, sum[0][i] = num[0][1] + ..num[0][i]

佳佳走过的路径必为(0, 1) -> (0, L) -> (1, L) -> (1, R) -> (2, R) - > (2, n).定义一个set<> s,

枚举R from1 to n, (0, 1)到(0, R)的距离为sum[0][R],  s.insert(sum[0][R] - sum[1][R-1])

设d为(1, 1) 到(2, n)经过转折点(1, R)的长度 d = sum[1][R] + sum[2][n] - sum[2][r-1]; d %= p;再在s集合中找一个数使之加上d后对p取模达到最大值,更新ans(最大娱乐值)


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#define maxn 100005
using namespace std;
typedef long long ll;

ll num[3][maxn], sum[3][maxn];
int main(){
	
//	freopen("in.txt", "r", stdin);
	int n, p;
	
	scanf("%d%d", &n, &p);
	for(int i = 0; i < 3; i++)
	 for(int j = 1; j <= n; j++){
	 	scanf("%I64d", &num[i][j]);
	 	(sum[i][j] = sum[i][j-1] + num[i][j]) %= p;
	 }
	set<ll> s;
	set<ll> ::iterator iter;
	ll ans = 0;
	for(int i = 1; i <= n; i++){
		ll k = (sum[0][i] - sum[1][i-1] + p) % p;
		s.insert(k);
		ll d = ((sum[1][i] + sum[2][n] - sum[2][i-1]) % p + p)% p;
		ans = max(ans, (*(--s.end()) + d) % p);
		iter = s.lower_bound(p - d);
		if(iter != s.begin()){
			ans = max(ans, (*(--iter) + d) % p);
		}
	}
	printf("%I64d\n", ans);
	
	return 0;
}



 


标签:佳佳,1624,51nod,sum,矩阵,int,num,取余,include
From: https://blog.51cto.com/u_16158872/6464601

相关文章

  • 51nod-1191 消灭兔子
    原题链接1191 消灭兔子题目来源: 2013腾讯马拉松赛第三场基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注有N只兔子,每只有一个血量B[i],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭......
  • 51nod-1158 全是1的最大子矩阵(单调栈)
    原题链接1158 全是1的最大子矩阵基准时间限制:1 秒空间限制:131072 KB分值: 80 难度:5级算法题 收藏 关注Input第1行:2个数m,n中间用空格分隔(2 <= m,n <= 500)第2 - N + 1行:每行m个数,中间用空格分隔,均为0或1。......
  • 77 加密一个值 +5 取余数 倒序
    正确的是二次倒序packagecom.fqs.test;importjava.util.Scanner;publicclasshello{publicstaticvoidmain(String[]args){//加密传输1983//每位上加5(1+5=6)%10取余9+5=148+5=133+5=8//对10取余//颠倒顺序输出......
  • 动态规划基础之矩阵取数问题 51nod1083
    题目地址:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1083题目:1083 矩阵取数问题基准时间限制:1 秒空间限制:131072 KB分值: 5 难度:1级算法题例如:3*3的方格。133213221......
  • 51nod 1298 圆与三角形(基础题,计算几何)
    题目链接:点击打开链接1298 圆与三角形题目来源: HackerRank基准时间限制:1 秒空间限制:131072 KB分值: 0 难度:基础给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"Yes",否则输出"No"。(三角形的面积大于0)。Inp......
  • 最大子矩阵和问题 动态规划 51nod1051
    1051 最大子矩阵和基准时间限制:2 秒空间限制:131072 KB分值: 40 难度:4级算法题例如:3*3的矩阵:-13-12-13-312和最大的子矩阵是:3-1-1312Input......
  • 51nod---无法表示的数
    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1176题意:z=(x/2)取整后+y+xy,x,y都是大于0的整数。即:x,y取不同的数,z可能有多种表示方式,也可能一种都没有,比如3,15就无法用任何x,y来表示。现在将所有无法表示的数排个序,组成一个序列S,给出一个整数n,你来求S[n......
  • 2022.11.23 51nod 图论专场?
    A反转Dag图:题面给出一个\(n\)个点\(m\)条边的有向图,顶点编号\(1\)到\(n\),边的编号为\(1\)到\(m\)。你可以选择一些边进行反转(即从\(u\)到\(v\)的边反转后变为从\(v\)到\(u\)的边),将每条边反转都需要一定代价。最终使得整个图变成一个\(Dag\)图。总的反......
  • 51nod 1227 平均最小公倍数 题解
    题目大意\[A(n)=\frac{1}{n}\sum_{i=1}^{n}\text{lcm}(n,i)\\F(a,b)=\sum_{i=a}^{b}A(i)\\\]给定\(a,b\),求\(F(a,b)\mod10^9+7\)。\(1\lea\leb\le10^9\)。思路首先我们可以想到,如果我们定义\(B(n)=\underset{i=1}{\overset{n}{\sum}}A(i)\),那么\(F(a,......
  • 51nod 1365 Fib(N) mod Fib(K)-题解
    51nod1365Fib(N)modFib(K)个人评价:考一些奇奇怪怪的知识点呢算法矩阵快速幂、斐波那契公式题面求\(F_n\%F_k\)的值,\(1\leqn,k\leq1e18\)问题分析我一开始居然想着直接矩阵快速幂求出两个值算,我也是真的牛……我们要知道这些斐波那契公式(考的真怪)\[F_{-n}=(-1)^{n......