A. Amr and Music (贪心)

水题,没能秒切,略尴尬。

 #include <cstdio>
#include <algorithm>
using namespace std; const int maxn = +;
int a[maxn], r[maxn], ans[maxn]; int cmp(int i, int j) { return a[i] < a[j]; } int main()
{
//freopen("in.txt", "r", stdin); int n, k;
scanf("%d%d", &n, &k);
for(int i = ; i < n; ++i) r[i] = i;
for(int i = ; i < n; ++i) scanf("%d", &a[i]);
sort(r, r + n, cmp);
int sum = , cnt = ;
for(int i = ; sum + a[r[i]] <= k && cnt < n; ++i)
{
sum += a[r[i]];
ans[cnt++] = r[i];
} printf("%d\n", cnt);
for(int i = ; i < cnt - ; ++i) printf("%d ", ans[i]+);
if(cnt) printf("%d\n", ans[cnt-]+); return ;
}

代码君

B. Amr and Pins (找规律)

题意:

给出一个圆的半径 和 圆心的始末位置。每次操作只能绕圆周上的点旋转若干角度。求该圆从初位置到末位置最少的操作次数。

分析:

不妨设圆的半径为r,圆心在原点处。

先看只旋转一次的情况,圆心所有可能位置构成的区域为  半径为2r的圆(除去圆心那点),也可理解为半径为(0, 2r]的圆环区域

再看第二次旋转,其区域为半径在(2r, 4r]的圆环区域。  //这个不容易画图,自行脑补一下好啦

以此类推。

算法:

所以我们可以先算出圆心始末位置间的距离d,然后根据d和直径2r的关系,最终答案为

 #include <cstdio>
#include <cmath> int main()
{
//freopen("in.txt", "r", stdin); int r, x1, y1, x2, y2, ans;
scanf("%d%d%d%d%d", &r, &x1, &y1, &x2, &y2);
double d = sqrt((long long)(x1-x2)*(x1-x2) + (long long)(y1-y2)*(y1-y2));
ans = (int)ceil(d / 2.0 / r);
printf("%d\n", ans); return ;
}

代码君

C. Guess Your Way Out! (模拟 LCA)

题意:

有一个树高为h的完全二叉树 和 一个目标叶子节点, 给出一种遍历方式(LRLRLR...)

求在到达目标节点时,遍历节点的总数。(不包括目标节点)

具体参见原文Guess Your Way Out!

分析:

以官方题解中的图为例。自己最开始对这道题没什么想法,所以后面的分析相当于题解的翻译。=_=||

从树根开始走到最底端,到达节点X。

如果X刚好是目标节点E,则得到结果为树高h。

否则,找到X和E的 Least Common Ancestor (最小公共祖先)。在右子树遍历之前,一定会遍历完左子树中所有的节点 (图中用红色标出) ,从而退出,进入右子树。

所以在到达右子树之前共遍历sum[h1] + h - h1,其中sum[h1]表示树高为h1的完全二叉树的节点个数。

在进入右子树后,更新树高h、根节点编号、遍历的方向(L or R),重复刚才的过程。

 #include <cstdio>
#include <vector>
#include <algorithm>
using namespace std; typedef long long LL; LL h, n, sum[], ans = ;
vector<LL> anc1; int main()
{
//freopen("in.txt", "r", stdin); for(int i = ; i <= ; ++i) sum[i] = (1LL << (i+)) - ;
scanf("%I64d%I64d", &h, &n);
n += sum[h-]; //转化成整个二叉树中的编号
LL x = n;
anc1.push_back(x); //目标节点的所有祖先
while(x != )
{
x /= ;
anc1.push_back(x);
}
//for(int i = 0; i < anc1.size(); ++i) printf("%I64d ", anc1[i]); LL node = ;
bool choice = false; //遍历防线(L or R) while(node != n)
{
vector<LL> anc2; //当前叶子节点X的祖先
for(int i = ; i < h; ++i)
{
anc2.push_back(node);
if(!choice) node = node * ; else node = node * + ;
choice = !choice;
}
if(n == node) { ans += h; break; }
anc2.push_back(node);
reverse(anc2.begin(), anc2.end());
//for(int i = 0; i < anc2.size(); ++i) printf("%I64d ", anc2[i]); for(int i = ; i <= h; ++i) if(anc1[i] == anc2[i])
{//find LCA
ans += sum[i-] + h - i + ;
h = i - ; //更新树高
node = anc2[i-];
if((anc2[i]<<) == node) //更新根节点的编号 及 遍历方向
{
node = anc2[i] * + ;
choice = false;
}
else
{
node = (anc2[i] << );
choice = true;
}
break;
}
} printf("%I64d\n", ans); return ;
}

代码君

CodeForces Round #287 Div.2的更多相关文章

  1. Codeforces Round #287 (Div. 2) E. Breaking Good 最短路

    题目链接: http://codeforces.com/problemset/problem/507/E E. Breaking Good time limit per test2 secondsme ...

  2. 贪心 Codeforces Round #287 (Div. 2) A. Amr and Music

    题目传送门 /* 贪心水题 */ #include <cstdio> #include <algorithm> #include <iostream> #inclu ...

  3. Codeforces Round #287 (Div. 2) C. Guess Your Way Out! 思路

    C. Guess Your Way Out! time limit per test 1 second memory limit per test 256 megabytes input standa ...

  4. Codeforces Round #287 (Div. 2) C. Guess Your Way Out! 水题

    C. Guess Your Way Out! time limit per test 1 second memory limit per test 256 megabytes input standa ...

  5. Codeforces Round #287 (Div. 2) B. Amr and Pins 水题

    B. Amr and Pins time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  6. Codeforces Round #287 (Div. 2) A. Amr and Music 水题

    A. Amr and Music time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  7. Codeforces Round #287 (Div. 2) E. Breaking Good [Dijkstra 最短路 优先队列]

    传送门 E. Breaking Good time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  8. Codeforces Round #287 (Div. 2) D. The Maths Lecture [数位dp]

    传送门 D. The Maths Lecture time limit per test 1 second memory limit per test 256 megabytes input stan ...

  9. codeforcfes Codeforces Round #287 (Div. 2) B. Amr and Pins

    B. Amr and Pins time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

随机推荐

  1. C语言的32个关键字

    由ANSI标准定义的C语言关键字共个: auto double int struct break else long switch case enum register typedef char ex ...

  2. PAT Ranking (排名)

    PAT Ranking (排名) Programming Ability Test (PAT) is organized by the College of Computer Science and ...

  3. Kinetic使用注意点--collection

    new Collection() 扩展了数组,主要用于配合new Container().get()使用 方法: each(func):遍历数组,执行回调函数.回调函数接收两个值,节点和索引. toA ...

  4. iOS通过http post上传图片 (转)

    转载自:http://www.cocoachina.com/bbs/read.php?tid=89985 由于iOS无法通过html表单来上传图片,因此想要上传图片,必须实现http请求,而不能像其他 ...

  5. 配置spring的事务管理

    网上看到过很多关于spring事务管理的东西,但是原创的并不多,如果你的运气好能看到那些原创的文章恭喜你,因为我看到的不多,但一些原创的文 章里面枝叶太多,因为那些高手直接把自己的代码拷过来,所以说无 ...

  6. (转载)Cocos2dx-OpenGL ES 2.0教程:你的第一个三角形(1)

    前言 在本系列教程中,我会以当下最流行的2D引擎Cocos2D-X为基础,介绍OpenGL ES 2.0的一些基本用法.本系列教程的宗旨是OpenGL扫盲,让大家在使用Cocos2D-X过程中,知其然 ...

  7. Android Studio 单刷《第一行代码》系列 04 —— Activity 相关

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  8. vs中使用过的扩展和好的nuget库

    扩展 ReAttach ReAttach gives you an easy way to ReAttaching your prior debug targets. ReAttach stores ...

  9. 'vt100': unknown terminal type.

    在Linux终端执行clear或top命令时出现:vt100: unknown terminal type的错误 1.临时办法,下次启动失效,需要重新执行 执行以下命令 $ printenv | gr ...

  10. 无法为请求的 Configuration 对象创建配置文件 错误原因

    Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 无法为请求的 Configura ...