有多种方案可选,其中比较短的是1~5和5~8。后者长度为3最短。
【数据规模】
对于50%的数据, N≤10000;
对于80%的数据, N≤800000;
对于100%的数据,1≤N≤1000000,1≤K≤60,0≤彩珠位置<2^31。
/************************************************************** Problem: 1293 Language: C++ Result: Accepted Time:4172 ms Memory:9192 kb ****************************************************************/ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<vector> #include<stack> #include<queue> using namespace std; #define MAX 61 #define IMAX 2147483647 struct BALL{vector<int> w;}; BALL a[MAX]; int N,K,first[MAX],ans=IMAX,min1=IMAX,max1=0; int where[MAX]; int num[MAX]; int main() { //freopen("input.in","r",stdin); //freopen("output.out","w",stdout); scanf("%d%d",&N,&K); for(int i=1;i<=K;i++) { int A; scanf("%d",&A); num[i]=A; for(int j=1;j<=A;j++) { int B; scanf("%d",&B); a[i].w.push_back(B); } where[i]=0; } for(int i=1;i<=N-K+1;i++) { int use=1; min1=IMAX,max1=0; for(int j=1;j<=K;j++) { min1=min(min1,a[j].w[where[j]]); max1=max(max1,a[j].w[where[j]]); } ans=min(ans,max1-min1); min1=IMAX; for(int j=1;j<=K;j++) { if(!(where[j]==num[j]-1) && (a[j].w[where[j]]<min1 || (a[j].w[where[j]]==min1 && a[j].w[where[j]+1]<a[use].w[where[use]+1]))) { use=j; min1=a[j].w[where[j]]; } } where[use]++; } printf("%d\n",ans); //system("pause"); return 0; }