UVA 10382のじょうろ草貪欲+インターバルカバレッジの問題

Nスプリンクラーはメートル長さW草Lメートルの水平ストリップに設置されています。各スプリンクラーは、ストリップの水平方向の中心線に設置されています。各スプリンクラーのために、我々は、中心線の左端からの距離と操作の半径としての地位を与えられています。

草のストリップ全体に水をするために、オンにスプリンクラーの最小数は何ですか?

 

入力

入力例数で構成されています。各ケースの最初の行は、nは整数N、L及びWが含ま10000≤次のn行は、スプリンクラーと操作の半径の位置を与える2つの整数を含みます。(画像は、上記のサンプル入力から最初のケースを示します。)

出力

各テストケースの出力のための草のストリップ全体を水に必要なスプリンクラーの最小数。それが不可能であればストリップ全体の出力を水に「-1」。

 

質問が意図されている:その長さと幅を考慮すると、中心と半径が次に与えられ、あなたのn個のスプリンクラーを与えるために、スプリンクラーQの最小数は、全体の帯をカバーすることができる必要があります。

アイデアは、左と右のセグメントのエンドポイントを使用することは、ピタゴラスの定理間隔のエンドポイントを決定し、各デバイスは、(小から大まで、右下降間隔を左範囲)をソート本構造に達し、最終的に間隔カバレッジ問題に変換することができます。それはすることができます。

特判:

  1. 最初のセクションの左端0以下を必要とソートが完了した後、右端点は、長さに等しい最大スワスよりも大きくなければなりません
  2. 次のポイントは、現在のセグメントの左部以下右点だけでなく、右部以下の右端点を考慮すること
  3. 右の現在の最大範囲よりも大きい横断中に次の間隔の点を残さ半ばオフ、場合、マークフラグを使用します

この7-15,13-17,15-20ビューは、距離は、ループ終了のために、座標変数更新する第2の列挙、変数への最長の距離によって記録されていることが容易となりますしかし、そうする権利は、テストデータでの生活が困難になることを発見し、任意の時間サイクルで終了することができます書き込みにwhileループを使用する必要があります。

已AC:

  1 #include<iostream>
  2 #include<math.h>
  3 #include<stdio.h>
  4 #include<algorithm>
  5 #define inf 0x3f3f3f3f
  6 using namespace std;
  7 
  8 struct node
  9 {
 10     double l;
 11     double r;
 12 } a[10020];
 13 
 14 int cmp1(node x,node y)
 15 {
 16     if(x.l!=y.l)
 17         return x.l<y.l;
 18     else
 19         return x.r>y.r;
 20 
 21 }
 22 //按左边界的坐标点从小到大排序,//右端点为什么不需要排序
 23 
 24 
 25 int main()
 26 {
 27     std::ios::sync_with_stdio(false);
 28     int n;
 29     double len,w;
 30     double c,rr;
 31     while(cin>>n>>len>>w)
 32     {
 33         int num=0;
 34         double maxxr=-1.0;
 35         for(int i=0; i<n; i++)
 36         {
 37             cin>>c>>rr;
 38             if(rr*2<=w)
 39             {
 40                 continue;
 41             }
 42             else
 43             {
 44                 double l=c-sqrt(rr*rr-w*w/4);
 45                 double r=c+sqrt(rr*rr-w*w/4);
 46               //   printf("%lf--%lf\n",l,r);
 47                 if(r>=maxxr)
 48                 {
 49                     maxxr=max(maxxr,r);
 50                 }
 51                 //      if(l<=0)
 52                 //   l=0;
 53                 a[num].l=l;
 54                 a[num++].r=r;
 55             }
 56         }
 57         sort(a,a+num,cmp1);
 58         int k=0;
 59         if(a[0].l>0||maxxr<len)
 60         {
 61             cout<<-1<<endl;
 62             continue;
 63         }
 64         double maxx=0;
 65         int ans=0;
 66         int flag=0;
 67         int ww=0;
 68         while(maxx<len)
 69         {
 70             double uu=maxx;
 71             for(int i=0; i<num; i++)
 72             {
 73                 if(a[i].l<=uu&&a[i].r>maxx)
 74                 {
 75                    // minn=a[i].l;
 76                     maxx=a[i].r;
 77 //                    zz=i;
 78                 }
 79             }
 80            // printf("%lf----%d\n",maxx,zz);
 81            if(uu==maxx&&uu<len)
 82            {
 83                ww=1;break;
 84            }
 85             //minn=a[zz].l;
 86             ans++;
 87             /*for(int i=0; i<num; i++)
 88             {
 89                 //printf("%lf*****%lf\n",a[i].l,a[i].r);
 90                 if(a[i].l<=maxx)
 91                 {
 92                     if(a[i].r>maxx)
 93                     {
 94                         maxx=a[i].r;
 95                         ans++;
 96                         printf("%lf----%lf\n",a[i].l,a[i].r);
 97                     }
 98                     else
 99                     {
100                         continue;
101                     }
102                 }
103                 if(a[i].l>maxx)
104                 {
105                     flag=0;
106                     break;
107                 }
108                 if(a[i].r>=len)
109                 {
110                     flag=1;
111                     break;
112                 }*/
113             //}//中间部分要是连接不上,处理:进行flag标记
114         }
115        // printf("%d\n",ans);
116         if(ww==0)
117             cout<<ans<<endl;
118         else
119             cout<<-1<<endl;
120     }
121     return 0;
122 }
View Code

 

利用for循环的代码,代码是错误的,但有这个思路在

  1 #include<iostream>
  2 #include<math.h>
  3 #include<stdio.h>
  4 #include<algorithm>
  5 #define inf 0x3f3f3f3f
  6 using namespace std;
  7 
  8 struct node
  9 {
 10     double l;
 11     double r;
 12 } a[10020];
 13 
 14 int cmp1(node x,node y)
 15 {
 16     if(x.l!=y.l)
 17         return x.l<y.l;
 18     else
 19         return x.r>y.r;
 20 
 21 }
 22 //按左边界的坐标点从小到大排序
 23 
 24 
 25 int main()
 26 {
 27     //std::ios::sync_with_stdio(false);
 28     int n;
 29     double len,w;
 30     double c,rr;
 31     while(cin>>n>>len>>w)
 32     {
 33         int num=0;
 34         double maxxr=-1.0;
 35         for(int i=0; i<n; i++)
 36         {
 37             cin>>c>>rr;
 38             if(rr*2<=w)
 39             {
 40                 continue;
 41             }
 42             else
 43             {
 44                 double l=c-sqrt(rr*rr-w*w/4);
 45                 double r=c+sqrt(rr*rr-w*w/4);
 46             //    printf("%lf--%lf\n",l,r);
 47                 if(r>=maxxr)
 48                 {
 49                     maxxr=max(maxxr,r);
 50                 }
 51                 //      if(l<=0)
 52                 //   l=0;
 53                 a[num].l=l;
 54                 a[num++].r=r;
 55             }
 56         }
 57         sort(a,a+num,cmp1);
 58         int k=0;
 59         int pp=0;
 60         if(a[0].l>0||maxxr<len)
 61         {
 62             cout<<-1<<endl;
 63             continue;
 64         }
 65         double maxx=0;
 66         double minn=0;
 67         int ans=0;
 68         int flag=0;
 69         int w=0;
 70         int ww=0;
 71         int d=0;
 72         int z=0;
 73         int qq=0;
 74         for(int i=0; i<num; i=qq)
 75         {
 76             //printf("%lf*****%lf\n",a[i].l,a[i].r);
 77             if(a[i].l<=maxx)
 78             {
 79                 if(a[i].r>maxx)
 80                 {
 81                     if(maxx>=len)
 82                     {
 83                         printf("%d\n",ans);
 84                         pp=1;
 85                     }
 86                     w=i;
 87                     ww=a[i].r-a[i].l;
 88                  //   maxx=a[i].r;
 89                  //     ans++;
 90                     //   printf("%lf----%lf\n",a[i].l,a[i].r);
 91                     for(int j=i+1;j<num;j++)
 92                     {
 93                         z=a[j].r-a[j].l;
 94                         if(a[j].l<=maxx&&a[j].r>maxx)
 95                         {
 96                             if(z>ww)
 97                             {
 98                                 w=z;
 99                             }
100                         }
101                         if(a[j].l>maxx)
102                             break;
103                     }
104              //       printf("%lf----%lf\n",a[i].l,a[i].r);
105                     maxx=a[w].r;
106                     qq=w;
107                     printf("%lf\n",maxx);
108                     w=0;
109                     ans++;
110                     if(maxx>=len)
111                     {
112                         printf("%d\n",ans);
113                         pp=1;
114                     }
115                     printf("%d\n",ans);
116                    if(pp==1)
117                     break;
118                 }
119                 else
120                 {
121                     continue;
122                 }
123                 if(pp==1)
124                     break;
125             }
126 
127 //            if(a[i].l>maxx)
128 //            {
129 //                flag=0;
130 //                break;
131 //            }
132 //            if(a[i].r>=len)
133 //            {
134  //                 フラグ= 1。
135  //                 ブレーク。
136  //             } 
137          }
 138          // のprintf( "%d個の\ n"、ANS)。
139  
140  
141        //   場合(フラグ)
142        / * IF(MAXX> = LEN)
 143              COUT << ANS << ENDL。
144       * / 
145          であれば(PPの== 0 146              - COUT << 1 << ; ENDL
147      }
 148      戻り 0 ;
149 }
コードの表示

 

 

おすすめ

転載: www.cnblogs.com/OFSHK/p/11220101.html