描述
有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n(n<=10000)個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。
輸入
第一行輸入乙個正整數n表示共有n次測試資料。
每一組測試資料的第一行有三個整數n,w,h,n表示共有n個噴水裝置,w表示草坪的橫向長度,h表示草坪的縱向長度。
隨後的n行,都有兩個整數xi和ri,xi表示第i個噴水裝置的的橫座標(最左邊為0),ri表示該噴水裝置能覆蓋的圓的半徑。
輸出每組測試資料輸出乙個正整數,表示共需要多少個噴水裝置,每個輸出單獨佔一行。
如果不存在一種能夠把整個草坪濕潤的方案,請輸出0。
樣例輸入
22 8 6
1 14 5
2 10 6
4 56 5
樣例輸出
12
分析:告訴你噴水的位置和噴射的半徑,你可以求出能覆蓋矩形草坪在水平方向上的長度,即知道每個噴水的左右端點,剩下的就是求在固定區間內問最少多少個小區間能夠覆蓋
#include #include #include #include #include #include #include #include #include #include using namespace std;
double len(double a,double b)
int cmp(paira,pairb)
int main()
}sort(v.begin(),v.end(),cmp);
int cnt = 0;
double right = 0;
while(right < w)
if(m)
else
break;///如果擴充套件不動了,那就說明已經擴充套件完成了
}if(right < w)
cout << 0 << endl;
else
cout << cnt << endl;
}return 0;
}
哈
#include #include #include #include #include #include #include #include #include #include using namespace std;
double len(double a,double b)
int cmp(paira,pairb)
int main()
} sort(v.begin(),v.end(),cmp);
int cnt = 0;
double right = 0;
int top = 0;
while(right < w)
else if(v[i].first > be)
}if(be > right) break;
else cnt++;
} if(right < w)
//cout << 0 << endl;
printf("0\n");
else
//cout << cnt << endl;
printf("%d\n",cnt);
} return 0;
}
噴水裝置(二) 區間覆蓋問題
題目描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。輸入第一行輸入乙個正整數n表示共有n次測試資料。每一組測試資料...
南陽 12 噴水裝置(二)區間覆蓋問題
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...
括號匹配(二)(區間dp)
給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s,s中只包含以上所說的四種字元,s的長度不超過100 對於每組測試資料都輸出...