喷水装置(贪心)

📅 发布时间:2026/7/8 15:16:06 👁️ 浏览次数:
喷水装置(贪心)
题目描述Time Limit: 1000 msMemory Limit: 256 mb长 米宽 米的草坪里装有 个浇灌喷头。每个喷头都装在草坪中心线上离两边各 米。我们知道每个喷头的位置离草坪中心线左端的距离以及它能覆盖到的浇灌范围。请问如果要同时浇灌整块草坪最少需要打开多少个喷头输入输出格式输入描述:输入包含若干组测试数据。 第一行一个整数 表示数据组数 每组数据的第一行是整数 、 和 接下来的 行每行包含两个整数给出一个喷头的位置和浇灌半径上面的示意图是样例输入第一组数据所描述的情况。 对于 100% 的数据输出描述:对每组测试数据输出一个数字表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开也不能浇灌整块草坪则输出 。输入输出样例输入样例#:3 8 20 2 5 3 4 1 1 2 7 2 10 2 13 3 16 2 19 4 3 10 1 3 5 9 3 6 1 3 10 1 5 3 1 1 9 1输出样例#:6 2 -1代码参考#includebits/stdc.h using namespace std; struct elem{ double begin; double end; double center; double r; }; bool cmp(elem a, elem b){ return a.begin b.begin; } int main(){ int t, h; cint; while(t--){ double n, l, w; cinnlw; vectorelem elems; for(int i 0; i n; i ){ int center, r; cincenterr; if(r w / 2.0){ continue; } else { elem temp; temp.center center; temp.r r; double d sqrt((temp.r * temp.r) - (w / 2.0 * w / 2.0));// temp.begin temp.center - d; temp.end temp.center d; elems.push_back(temp); } } sort(elems.begin(), elems.end(), cmp); double current 0; int count 0, i 0; bool success true; while(current l){ double max current; while(i elems.size() elems[i].begin current){//查找在begin在范围内的 if(elems[i].end max){//找最远的那个 max elems[i].end; } i ; } if(max current){//没找到 success false; break; } else{ count ; current max; } } if(success){ coutcountendl; } else { cout-1endl; } } }