2014 微软 编程之美 初赛 第一场 题解

来源:互联网 发布:node.js 构建工具 编辑:程序博客网 时间:2024/05/21 08:56

2014 微软 编程之美 初赛 第一场 题解

趁热写个题解.这场一共才三题.

第一题 焦距

这...大致就是给你公式照着敲,处理好字符串就行,自认为代码写的蛮干净的~~
#include <stdio.h>#include <stdlib.h>#include <string.h>double weight(char *s){if (strcmp(s, "m") == 0) return 1000;if (strcmp(s, "dm") == 0) return 100;if (strcmp(s, "cm") == 0) return 10;if (strcmp(s, "mm") == 0) return 1;if (strcmp(s, "um") == 0) return 1e-3;if (strcmp(s, "nm") == 0) return 1e-6;return 1;}int main(){double a, b, c, d;char sa[3], sb[3], sc[3];int T, cas;scanf("%d", &T);for (cas = 1; cas <= T; cas++){scanf("%lf%s%lf%s%lf%s", &a, sa, &b, sb, &c, sc);//printf("%s,%s,%s\n", sa, sb, sc);a *= weight(sa);b *= weight(sb);d = c * a / b;printf("Case %d: %0.2lfpx\n", cas, d);}return 0;}

第二题 树

这是最难的一题,但是大数据太弱了,竟然都暴过了...
题意:N(1e5)个点的树,初始点权都为0,有Q(1e5)个操作,每次操作在以u为根的子树中,对深度(根的深度为1)在区间[l,r]内的点加权delta.输出最终的所有点权(经过给定的hash处理,方便judge).

经波哥讲解,可以这么搞:
有区间操作,容易想到用线段树.在深度区间上,建个线段树,a[i]表示深度为i时的权值.这玩意有用么?当然,某个点的权值就是他那个深度上的权值.但是加权操作时不是一整层都加的,只是加某一子树上的,如果给一整层都加上,会影响到别的不该加权的子树,这怎么办呢?别急,算完这颗子树,再把加权都减掉就好了。这里巧在计算的顺序,不是一口气算出所有点权,都是按照dfs序一个个算。按dfs序,遍历到某点,执行u等于该点区间操作,更新之前建的线段树。由于与他祖先节点相关的操作都已经更新到线段树上了,所以当前线段树上对应深度的值就是他的权值。等遍历出了他这棵子树,也就是他的孩子节点都算完了,再把之间的操作消掉。
总之感觉很巧啊,首先想到在深度区间上建线段树是比较显然的,但是操作修改的区间和子树有关,那就dfs下,边计算边修改,回溯的时候再恢复回来。

我是暴过的,就不贴代码了.


第三题 活动中心

题意:平面上一堆点,在X轴上找一点使得离所有点的距离和最小。

列出式子,或者画个图看看,大致可以看出随着点从负无穷到正无穷移动,距离和是先变小后增大的,是个单峰函数,于是可以用三分法求极值。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>const int MAXN = 1e5;const double eps = 1e-8;struct Point{double x, y;};Point a[MAXN];int n;int dblcmp(double a, double b){if (a - b > eps) return 1;if (b - a > eps) return -1;return 0;}double dis(Point a, Point b){return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));}double TotDis(double x){Point k = {x, 0};double ret = 0;for (int i = 0; i < n; i++)ret += dis(k, a[i]);return ret;}int main(){int i, j, k, cas, T;double low, high, midl, midr;scanf("%d", &T);for (cas = 1; cas <= T; cas++){scanf("%d", &n);for (j = 0; j < n; j++)scanf("%lf %lf", &a[j].x, &a[j].y);low = high = a[0].x;for (i = 1; i < n; i++){if (low > a[i].x) low = a[i].x;if (high < a[i].x) high = a[i].x;}while(dblcmp(low, high) < 0){midl = (high - low) / 3 + low;midr = (high - low) * 2 / 3 + low;double vl = TotDis(midl);double vr = TotDis(midr);if (vl > vr){low = midl;}else if (vl < vr){high = midr;}else{low = midl;high = midr;}}printf("Case %d: %0.6lf\n", cas, (low + high) / 2);}return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机4g网用不了怎么办 手机玩王者荣耀卡怎么办 华为隐私空间密码忘记了怎么办 华为手机王者太卡怎么办 华为手机太卡怎么办呢 华为手机5x太卡!怎么办 华为手机玩游戏时太卡了怎么办? 买到华为翻新机怎么办 华为畅享8声音小怎么办 华为5a安全模式怎么办 手机跳屏怎么办金立 苹果手机触控不灵敏怎么办 华为mate8手机声音小怎么办 华为mate9相机无法对焦怎么办 新疆外地电信卡信号差怎么办 华为手机搜索不到wifi怎么办 华为浏览器恢复只有一个页面怎么办 华为手机触摸屏没反应怎么办 快递不给送上楼怎么办 华为荣耀手机声音小怎么办 华为手机来电铃声小怎么办 s弯出来时老压线怎么办 苹果7p手机弯了怎么办 小米手机摔弯了怎么办 华为畅享5没声音怎么办 掌阅语音闪退怎么办 华为mate开屏成排线怎么办 华为mate8电池坏了怎么办 8plus拍照不清晰怎么办 荣耀手环3丢了怎么办 华为mate9手机声音小怎么办 华为麦芒6丢了怎么办 华为麦芒4无法访问移动网络怎么办 自拍时屏幕是白的怎么办 华为麦芒5手机音量小怎么办 小米5x玩王者卡怎么办 小米5x打王者卡怎么办 华为荣耀10卡顿怎么办 麦芒6记不得密码怎么办 华为麦芒4镜头碎了怎么办 三星s5出像网的信号怎么办