• <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;
            }

             

            久久中文字幕视频、最近更新| 久久免费高清视频| 亚洲人成网站999久久久综合| 性做久久久久久久| 国产精品va久久久久久久| 国内精品伊人久久久久妇| 久久精品午夜一区二区福利| 狠狠久久综合伊人不卡| 亚洲AV日韩精品久久久久| 国产精品美女久久久久av爽| 色播久久人人爽人人爽人人片AV| 久久精品aⅴ无码中文字字幕不卡| 久久99精品国产麻豆婷婷| 久久精品亚洲精品国产色婷| 久久www免费人成看国产片| 久久国产免费观看精品3| 人妻系列无码专区久久五月天| 国产成人久久AV免费| 麻豆av久久av盛宴av| 久久一区二区三区99| 久久香蕉国产线看观看乱码| 亚洲第一极品精品无码久久 | 亚洲天堂久久久| 91精品国产高清久久久久久国产嫩草| 久久久久se色偷偷亚洲精品av| 久久久国产精品福利免费| 精品久久8x国产免费观看| 97精品依人久久久大香线蕉97| 久久久无码精品亚洲日韩软件| segui久久国产精品| 日韩精品久久久久久| 久久美女人爽女人爽| 色综合久久久久网| 国产成人精品久久综合 | 伊人久久综合精品无码AV专区 | 久久精品无码一区二区日韩AV| 久久w5ww成w人免费| 久久国产精品77777| 成人久久精品一区二区三区| 久久这里只有精品18| AV色综合久久天堂AV色综合在|