假设海岸是一条无限长的直线,陆地位于海岸的一侧,海洋位于另外一侧。 每个小岛都位于海洋一侧的某个点上。 雷达装置均位于海岸线上,且雷达的监测范围为 d,当小岛与某雷达的距离不超过 d 时,该小岛可以被雷达覆盖。 我们使用笛卡尔坐标系,定义海岸线为 x 轴,海的一侧在 x 轴上方,陆地一侧在 x 轴下方。 现在给出每个小岛的具体坐标以及雷达的检测范围,请你求出能够使所有小岛都被雷达覆盖所需的最小雷达数目。
输入格式 第一行输入两个整数 n 和 d,分别代表小岛数目和雷达检测范围。 接下来 n 行,每行输入两个整数,分别代表小岛的 x,y 轴坐标。 同一行数据之间用空格隔开。
int cnt = 0; double last = -INF; for (int i = 0;i < n;i++){ if (last < seg[i].l){// 如果当前区间不包含最后一个选择的点,则选择当前右端点 cnt++; last = seg[i].r; } }
printf("%d\n",cnt); } return0; }
5 acwing.1235. 付账问题
第九届蓝桥杯省赛C++A组,第九届蓝桥杯省赛JAVAA组
1 2 3 4 5 6 7 8 9 10 11 12
几个人一起出去吃饭是常有的事。 但在结帐的时候,常常会出现一些争执。 现在有 n 个人出去吃饭,他们总共消费了 S 元。 其中第 i 个人带了 ai 元。
幸运的是,所有人带的钱的总数是足够付账的,但现在问题来了:每个人分别要出多少钱呢? 为了公平起见,我们希望在总付钱量恰好为 S 的前提下,最后每个人付的钱的标准差最小。 这里我们约定,每个人支付的钱数可以是任意非负实数,即可以不是 1 分钱的整数倍。 你需要输出最小的标准差是多少。 标准差的介绍:标准差是多个数与它们平均数差值的平方平均数,一般用于刻画这些数之间的“偏差有多大”。 形式化地说,设第 i 个人付的钱为 bi 元,那么标准差为 :
int n; double S;// 用double存,要计算平均值 int a[N]; intmain(){ scanf("%d %lf",&n,&S); for (int i = 0;i < n;i++) scanf("%d",&a[i]);
sort(a,a+n); // 记得排序 double res = 0,avg = S / n; for (int i = 0;i < n;i++){ double cur = S/(n-i);// 当前平均值 if (a[i] < cur) cur = a[i];// 带的钱a[i]不够平均值则全交 // 带的钱a[i]够平均值则交平均值 res += (cur-avg)*(cur-avg)/n; S -= cur;// 更新当前要付的总费用 }