• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C小加

            厚德 博學 求真 至善 The bright moon and breeze
            posts - 145, comments - 195, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            Uestc 1652 Grab a hole(貪心+枚舉)

            Posted on 2012-05-06 14:50 C小加 閱讀(1481) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告

            很遺憾比賽的時候沒做出來,當時用貪心的方法寫過,可是思路有問題,WA了。解題報告上面只說是貪心,但具體怎么寫沒有說。于是我就嘗試了一些貪心想法,終于AC。24ms的時間還挺靠前的。

             題意:N個老鼠洞和N個老鼠,老鼠有個興趣區間[s,t],就是說老鼠會對這個范圍內的洞感興趣,他們會占領自己感興趣的洞。有一個興趣波動范圍K,求一個最小的K使得所有的老鼠都能占領自己感興趣的洞。

            分析:按照左邊區間從小到大排序,然后開始枚舉每一個區間,從區間右邊的端點開始放,如果那個位置已經有老鼠的話,就向前遍歷一遍看前邊的洞是否已滿,沒有滿的話就向前遍歷,遇到左端點的值小于這個老鼠的左端點值時,就交換,直到遇到一個空洞。如果滿了的話就向后遍歷,遇到右端點大于這個老鼠的右端點時,就交換,直到遇到一個空洞。遍歷的時候要時刻判斷K的值,如果到達不了那個范圍,就增大K的值。

            #include<iostream>
            #include<cstdio>
            #include<cstring>
            #include<algorithm>
            using namespace std;

            typedef struct
            {
                int s,t;
            }ract;
            ract r[503];
            int line[503];
            bool cmp(ract r1,ract r2)
            {
                if(r1.s==r2.s) return r1.t<r2.t;
                return r1.s<r2.s;
            }

            int main()
            {
                int t,pos=0;
                scanf("%d",&t);
                while(t--)
                {
                    memset(line,-1,sizeof(line));
                    int n;
                    scanf("%d",&n);
                    for(int i=0;i<n;++i)
                    {
                        scanf("%d %d",&r[i].s,&r[i].t);
                    }
                    sort(r,r+n,cmp);
                    int k=0;
                    for(int i=0;i<n;++i)
                    {
                        if(line[r[i].t]==-1)//如果右端點的洞是空的
                        {
                            line[r[i].t]=i;
                        }
                        else
                        {
                            int flag=0,temp=i;
                            if(r[i].t>1)
                             for(int j=r[i].t-1;j>=1;--j)//向前遍歷,是否已住滿
                             {
                                 if(line[j]==-1) {flag=1;break;}
                             }
                             if(flag==1)
                            for(int j=r[i].t;j>=1;--j)//如果沒有住滿就向前遍歷
                            {
                                if(line[j]==-1)//遇到空洞就住下
                                {
                                    line[j]=temp;
                                    if(r[temp].s>j)
                                    k=max(k,r[temp].s-j);//更新K值
                                    break;
                                }
                                else if(r[line[j]].s<r[temp].s)//如果當前洞中的老鼠的左端點小于移動的老鼠的左端點,就交換
                                {
                                    int tmp2=line[j];
                                    line[j]=temp;
                                    if(r[temp].s>j)
                                    k=max(k,r[temp].s-j);
                                    temp=tmp2;
                                }
                            }
                            else
                            {
                                for(int j=r[i].t;j<=n;++j)//如果已經住滿就向后遍歷
                                {
                                    if(line[j]==-1)
                                    {
                                        line[j]=temp; 
                                        if(r[temp].t<j)
                                        k=max(k,j-r[temp].t);
                                        break;
                                    }
                                    else
                                    {
                                        if(r[line[j]].t>r[temp].t)
                                        {
                                            int tmp2=line[j];
                                            line[j]=temp;
                                            if(r[temp].t<j)
                                             k=max(k,j-r[temp].t);
                                             temp=tmp2;
                                        }
                                        
                                    }
                                }
                            }
                        }

                    }
                    printf("Case #%d: %d\n",++pos,k);

                }
                return 0;
            }

             

            久久精品国产久精国产思思 | 久久久久综合中文字幕| 久久天天躁狠狠躁夜夜96流白浆| 亚洲欧美成人久久综合中文网 | 人妻无码精品久久亚瑟影视| 久久国产精品免费一区| 99精品久久久久久久婷婷| 国产精品美女久久久久久2018| 久久亚洲私人国产精品vA| 亚洲综合伊人久久大杳蕉| av无码久久久久不卡免费网站| 97r久久精品国产99国产精| 国内精品久久久久影院日本| 91精品国产乱码久久久久久| 久久精品一区二区国产| 久久精品国产亚洲AV不卡| 亚洲人成无码网站久久99热国产| 亚洲精品第一综合99久久| 久久99精品久久久大学生| 国产精品无码久久久久久| 国产精品99久久精品爆乳| 一本大道久久香蕉成人网| 欧美精品乱码99久久蜜桃| 国产精品国色综合久久| 久久夜色精品国产亚洲av| 婷婷综合久久中文字幕蜜桃三电影| 国产精品久久久久aaaa| 国内精品久久久久久麻豆| 久久天天躁狠狠躁夜夜不卡| 久久超碰97人人做人人爱| 久久久久久久综合综合狠狠| 国产成人精品久久| 国产精品女同一区二区久久| 国产69精品久久久久久人妻精品| 99久久这里只有精品| 久久精品视频一| 久久九九有精品国产23百花影院| 久久精品国产男包| 久久亚洲国产成人精品无码区| 91久久精一区二区三区大全| 久久九九兔免费精品6|