8.3.1 棋盘覆盖问题
略
8.3.2 循环日程表问题
构造第一组解,然后剩下的对应第一组解构造即可。
8.3.3 巨人与鬼
按照y坐标排序,按照极坐标[0, PI)扫描范围的对应点。
8.3.4 非线性方程求根
c
#include <stdio.h> int main(int argc, const char *argv[]) { double a, c, x = 0, y = 100; int i, b; scanf("%lf%d%lf", &a, &b, &c); while(y-x > 1e-5) { double m = x + (y-x)/2; double f = a; for(i = 0; i < b; i++) f += f*m/100 -c; if(f < 0) x = m; else y = m; } printf("%.3lf%%\n", x); return 0; }
8.5.3 最大值最小化
二分区间和最小值,遍历数组。
c
#include <stdio.h> const int MAXN = 1000; int a[MAXN]; int main(int argc, const char *argv[]) { int n, m; int maxn = 0, sum; while(~scanf("%d%d", &n, &m)) { sum = 0; for(int i = 0; i < n; i++) { scanf("%d", &a[i]); sum += a[i]; } int x = 0, y = sum; int temp, less; int cnt, maxn; // temp = x 成立,则y = temp while(x < y-1) { cnt = m; less = 0; temp = x + (y-x)/2; sum = 0; for(int i = 0; i < n; i++) { sum += a[i]; if(sum > temp) { cnt --; sum = a[i]; if(cnt == 0) { less = 1; break; } } else if(temp == sum) { cnt --; sum = 0; if(cnt == 0 && i != n-1) { less = 1; break; } } } if(less) x = temp; else y = temp; } printf("%d\n", temp); } return 0; }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。