Nスプリンクラーはメートル長さW草Lメートルの水平ストリップに設置されています。各スプリンクラーは、ストリップの水平方向の中心線に設置されています。各スプリンクラーのために、我々は、中心線の左端からの距離と操作の半径としての地位を与えられています。
草のストリップ全体に水をするために、オンにスプリンクラーの最小数は何ですか?
入力
入力例数で構成されています。各ケースの最初の行は、nは整数N、L及びWが含ま10000≤次のn行は、スプリンクラーと操作の半径の位置を与える2つの整数を含みます。(画像は、上記のサンプル入力から最初のケースを示します。)
出力
各テストケースの出力のための草のストリップ全体を水に必要なスプリンクラーの最小数。それが不可能であればストリップ全体の出力を水に「-1」。
質問が意図されている:その長さと幅を考慮すると、中心と半径が次に与えられ、あなたのn個のスプリンクラーを与えるために、スプリンクラーQの最小数は、全体の帯をカバーすることができる必要があります。
アイデアは、左と右のセグメントのエンドポイントを使用することは、ピタゴラスの定理間隔のエンドポイントを決定し、各デバイスは、(小から大まで、右下降間隔を左範囲)をソート本構造に達し、最終的に間隔カバレッジ問題に変換することができます。それはすることができます。
特判:
- 最初のセクションの左端0以下を必要とソートが完了した後、右端点は、長さに等しい最大スワスよりも大きくなければなりません
- 次のポイントは、現在のセグメントの左部以下右点だけでなく、右部以下の右端点を考慮すること
- 右の現在の最大範囲よりも大きい横断中に次の間隔の点を残さ半ばオフ、場合、マークフラグを使用します
この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 }
利用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 }