P1130 红牌

P1130 红牌

某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂 ,一共包括N个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程,每一步政府都派了M个工作人员来检查材料。不幸的是,并不是每一个工作人员效率都很高。尽管如此,为了体现“公开政府”的政策,政府部门把每一个工作人员的处理一个申请所花天数都对外界公开。

为了防止所有申请人都到效率高的工作人员去申请。这M*N个工作人员被分成M个小组。每一组在每一步都有一个工作人员。申请人可以选择任意一个小组也可以更换小组。但是更换小组是很严格的,一定要相邻两个步骤之间来更换,而不能在某一步骤已经开始但还没结束的时候提出更换,并且也只能从原来的小组I更换到小组I+1,当然从小组M可以更换到小组1。对更换小组的次数没有限制。

例如:下面是3个小组,每个小组4个步骤工作天数:

小组1 2 6 1 8

小组2 3 6 2 6

小组3 4 2 3 6

例子中,可以选择小组1来完成整个过程一共花了2+6+1+8=17天,也可以从小组2开始第一步,然后第二步更换到小组3,第三步到小组1,第四步再到小组2,这样一共花了3+2+1+6=12天。你可以发现没有比这样效率更高的选择。

你的任务是求出完成申请所花最少天数。

输入输出格式

输入格式:

输入文件red.in的第一行是两个正整数N和M,表示步数和小组数。接下来有M行,每行N个非负整数,第i+1(1<=i<=M)行的第j个数表示小组i完成第j步所花的天数,天数都不超过1000000。

输出格式:

输入文件red.out仅包括1个正整数,为完成所有步所需最少天数。。

输入输出样例

输入样例#1:

4 3
2 6 1 8
3 6 2 6
4 2 3 6

输出样例#1:

12

说明

【数据规模与约定】

对于100%的数据,有N ≤ 2000, M ≤ 1000。

分析:

dp[i][j]表示完成前i个步骤恰好在j队列需要的最少天数
f[i][j]为f[i-1][j]和 f[i-1][(j-1+m)%m]中的较小值
f[i][j]=min(f[i-1][j],f[i-1][(j-1+m)%m])+mp[j][i];
因为是环,所以要%m
等式的右面一个表示当前队列,一个表示上一个队列

 1 /*
 2 dp[i][j]表示完成前i个步骤恰好在j队列需要的最少天数
 3 f[i][j]为f[i-1][j]和 f[i-1][(j-1+m)%m]中的较小值
 4 f[i][j]=min(f[i-1][j],f[i-1][(j-1+m)%m])+mp[j][i];
 5 因为是环,所以要%m
 6 等式的右面一个表示当前队列,一个表示上一个队列
 7 */
 8 #include<algorithm>
 9 #include<iostream>
10 #include<cstring>
11 #include<cstdio>
12 using namespace std;
13 int n,m,mp[1005][2005],f[2005][1005];
14 int main()
15 {
16     scanf("%d%d",&n,&m);
17     for(int i=0;i<=m-1;i++)
18         for(int j=1;j<=n;j++)
19             scanf("%d",&mp[i][j]);
20     memset(f,0x3f,sizeof(f));
21     for(int i=0;i<=m-1;i++)
22         f[0][i]=0;
23     for(int i=1;i<=n;i++)
24         for(int j=0;j<=m-1;j++)
25             f[i][j]=min(f[i-1][j],f[i-1][(j-1+m)%m])+mp[j][i];
26     printf("%d\n",*min_element(f[n],f[n]+m));
27     return 0;
28 }  
时间: 2024-07-28 13:48:44

P1130 红牌的相关文章

洛谷 P1130 红牌

P1130 红牌 题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了M个工作人员来检查材料.不幸的是,并不是每一个工作人员效率都很高.尽管如此,为了体现“公开政府”的政策,政府部门把每一个工作人员的处理一个申请所花天数都对外界公开. 为了防止所有申请人都到效率高的工作人员去申请.这M*N个工作人员被分成M个小组.每一组在每一步都有一个工作人员.申请

Luogu【P1130】红牌(DP)

欧拉 本蒟蒻第一个自己想出来的DP题 请移步题目链接 调了半天.i从1到n,j从1到m. f[i][j]表示的是第i道工序在第j个小组办完所花的最短时间. 因为要用到上一个状态,而上一个状态要么是同一小组,要么是上一个小组 所以j的做法跟题目是反着的 so转移方程 f[i][j]=min(f[i-1][j],f[i-1][j==1?n:j-1]); f[i][j]+=mp[j][i]; 然后就找到完成所有工序耗时最短的组就行啦 #include<cstdio> #include<cstd

题解 P1130 【红牌】

逆推dp经典题目:数字三角形的折叠版 为什么这么说? 因为我们会发现:除了每一次都特判一下是否转换行号以外,剩下的思想没什么不同. 没看题目的看这里 先定义: n,m是步骤数目,小组数目 work[i][j]表示第i个小组第j步需要的天数 f[i][j]表示当前第i个小组第j步的最优天数 首先我们先看到这个题说是要求最小天数 然后我们知道这个最小天数是由原先的两个最小天数分别加上当前小组工作天数,然后二者求最小值(因为前面的两个子状态--天数决定了后面的状态--当前最小天数) 这中间告诉我们当最

洛谷1130 红牌

洛谷1130 红牌 本题地址:http://www.luogu.org/problem/show?pid=1130 题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了M个工作人员来检查材料.不幸 的是,并不是每一个工作人员效率都很高.尽管如此,为了体现“公开政府”的政策,政府部门把每一个工作人员的处理一个申请所花天数都对外界公开. 为了防止所有申请

洛谷 1130红牌

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了M个工作人员来检查材料.不幸的是,并不是每一个工作人员效率都很高.尽管如此,为了体现"公开政府"的政策,政府部门把每一个工作人员的处理一个申请所花天数都对外界公开. 为了防止所有申请人都到效率高的工作人员去申请.这M*N个工作人员被分成M个小组.每一组在每一步都有一个工作人员.申请人可以选

[USACO07OCT]障碍路线 &amp; yzoj P1130 拐弯 题解

题意 给出n* n 的图,A为起点,B为终点,* 为障碍,.可以行走,问最少需要拐90度的弯多少次,无法到达输出-1. 解析 思路:构造N * M * 4个点,即将原图的每个点分裂成4个点.其中点(i,j,k)表示在(i,j)时人的方向是k,然后对于两个点(i,j,k)和(i,j,kk),如果k和kk是两个旋转90度能转换的方向,就连一条边权为1的边,而对于(i,j,k)和(i+dx[ k],j+dy[k],k)连一条边权为0的边,表示从(i,j)在方向为k的情况下能向k方向走一步到达(i+dx

BZOJ1419: Red is good

1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 639  Solved: 247[Submit][Status][Discuss] Description 桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元.可以随时停止翻牌,在最优策略下平均能得到多少钱. Input 一行输入两个数R,B,其值在0到5000之间 Output 在最优策略下平均能得到多少钱

Codeforces Round #281 (Div. 2) A. Vasya and Football 暴力

A. Vasya and Football Vasya has started watching football games. He has learned that for some fouls the players receive yellow cards, and for some fouls they receive red cards. A player who receives the second yellow card automatically receives a red

JAVA回调机制(CallBack)详解

序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法. 第1章. 故事的缘起 幼师在黑板上写一个式子 “1