【codevs2950】突击考试

题目描述 Description

一日,教授决定进行一次突击考试。每个人都有一个考试等级,教室里面一共有N个课桌,按照顺序排成一列,每个课桌可以坐两个人,记他们的能力等级为(A[i],B[i])。现在教授决定对能力等级为K的人进行测验。他会从这N排中选择连续的L排进行测验,要求这L排中的每一排至少有一个人考试等级为K。现在我们想知道L的最大值以及对应的等级K。

输入描述 Input Description

第1行:1个整数,N

 第2..N+1行:每行2个整数,表示A[i],B[i]

输出描述 Output Description

第1行:2个整数,L,K,要求在L最大的条件下K最小。

样例输入 Sample Input

 3

 3  5

 4  5

 1  3

样例输出 Sample Output

2  5

数据范围及提示 Data Size & Hint

1≤N≤100000,1≤A[i],B[i]≤5

【题解】

只是一个简单的dp而已,f[i][j]表示当k值为i时第j个人的最长的L的长度。

【代码】

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,Max,maxn;
int a[100005],b[100005],f[10][100005];
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;++i)
	  scanf("%d%d",&a[i],&b[i]),maxn=max(maxn,max(a[i],b[i]));
	for (int i=1;i<=maxn;++i)
	  for (int j=1;j<=n;++j)
	    if (a[j]==i||b[j]==i)
	      f[i][j]=f[i][j-1]+1;
	for (int i=1;i<=maxn;++i)
	  for (int j=1;j<=n;++j)
	    Max=max(Max,f[i][j]);
	for (int i=1;i<=maxn;++i)
	  for (int j=1;j<=n;++j)
	    if (f[i][j]==Max){
	    	printf("%d %d\n",Max,i);
	    	return 0;
	    }
}



你可能感兴趣的:(dp,codevs)