码迷,mamicode.com
首页 > 其他好文 > 详细

[SCOI2009]生日礼物(尺取法)

时间:2019-05-23 20:51:22      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:保险   技术   最小   颜色   尺取法   style   hide   namespace   队列   

暴力出奇迹 考前刷水

因为懒得写单调队列/优先队列,这里给出一个劣质的O(nk)做法,可能会被卡常(看你写的常数是否优秀了)成80/90(我第一次在luogu交就90),保险起见开O2很稳的。首先把每种颜色最靠前的加入,然后统计最大值减最小值作为初始的ans。然后每次将所有颜色中当前位置最靠前的那种颜色往后移动一格(若为该颜色最后的位置则可以退出了),暴力找最大、最小值,更新ans。易知答案就在其中。

技术图片
#include<bits/stdc++.h>
using namespace std;
int n,k,mn,mx,pos,ans,a[65];
vector<int>G[65];
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1,x,y;i<=k;i++)
    {
        scanf("%d",&x);
        while(x--)scanf("%d",&y),G[i].push_back(y);
    }
    mn=mx=G[1][0];
    for(int i=2;i<=k;i++)mn=min(mn,G[i][0]),mx=max(mx,G[i][0]);
    ans=mx-mn;
    while(1)
    {
        mn=G[1][a[1]],pos=1;
        for(int i=2;i<=k;i++)if(G[i][a[i]]<mn)mn=G[i][a[i]],pos=i;
        a[pos]++;
        if(a[pos]==G[pos].size())break;
        mn=mx=G[1][a[1]];
        for(int i=2;i<=k;i++)mn=min(mn,G[i][a[i]]),mx=max(mx,G[i][a[i]]);
        ans=min(ans,mx-mn);
    }
    printf("%d",ans);
}
View Code

 

[SCOI2009]生日礼物(尺取法)

标签:保险   技术   最小   颜色   尺取法   style   hide   namespace   队列   

原文地址:https://www.cnblogs.com/hfctf0210/p/10914189.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!