srm 526.5 题解

这套题是cgy出的,良心的保证啊

250

题意:

n个数编号1~n,每次删掉完全平方数,剩下的数重新标号,求最后剩下的数的初始标号

Solution:

其实可以理解为剩下的数的最大标号,暴力每次看当前剩下的最大编号的数是否被删除即可。最后剩下的即为答案。

Code:

#include <bits/stdc++.h>
using namespace std;
class MagicCandy {
    public:
    int whichOne(int n) {
        int last = n;
        while (n > 1) {
            int d = sqrt(n);
            if (d * d == n) --last;
            n -= d;
        }
        return last;
    }
};

500

题意:

给定n种球,每种球的数量,球等概率落在格子里,给出每种球落地范围,让你求每个格子中球的个数的平方的期望。

Solution

注意到平方期望是不具有线性性的,然而我们可以发现

E((x+1)2)?E(x2)=E(2x+1)=2E(x)+1,我们很容易算出E(x),然后推一下就好了。注意网上推的时候要保证range是递增的,否则不满足上式

Code:

#include <bits/stdc++.h>
using namespace std;
class MagicBlizzard {
    public:
    double expectation(vector <int> range, vector <int> amount) {
        double ans = 0.0;
        int n = range.size(), k = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = n - 1; j > 0; --j)
                if (range[j - 1] > range[j])    swap(range[j - 1], range[j]), swap(amount[j - 1], amount[j]);
            for (int j = 0; j < amount[i]; ++j)
                ans += 2.0 * (k++) / (2.0 * range[i] + 1) / (2.0 * range[i] + 1) + 1;
        }
        return ans;
    }
};
时间: 2024-12-26 13:14:04

srm 526.5 题解的相关文章

Topcoder SRM 607 div1题解

好久没来写了,继续继续... Easy(250pts): //前方请注意,样例中带有zyz,高能预警... 题目大意:给你一个字符串,中间有一些是未知字符,请你求出这个字符串的回文子串个数的期望值.数据满足字符最多2500个. 我们考虑每一个子串,它对答案的贡献度就是它是回文串的概率,那么我们扫一遍就可以了, 这样做时间复杂度O(n^3),显然过不去. 我们考虑一下对于一个子串,在判断其是回文串的时候,我们一定是从中间往两边扫的,那么其实中间这些子串我们已经统计过答案了, 也就是说,我们通过枚举

Topcoder SRM 603 div1题解

昨天刚打了一场codeforces...困死了...不过赶在睡前终于做完了- 话说这好像是我第一次做250-500-1000的标配耶--- Easy(250pts): 题目大意:有一棵树,一共n个节点,每个节点都有一个权值,两人A和B分别进行操作,由A先手,每人可以选择一条边,将它删掉得到两个联通块.游戏不断进行下去,最后只剩下一个节点.A希望最后的节点权值尽可能大,B希望尽可能小,求这个最后的值.数据保证n<=50. 这道题真的是博弈好题啊-(感觉放到ACM很合适啊) 我们考虑第一次A会如何选

Topcoder SRM 608 div1 题解

Easy(300pts): 题目大意:有n个盒子,一共有S个苹果,每个盒子有多少个苹果不知道,但是知道每个盒子的苹果下限和上限.现在要至少选择X个苹果,问如果要保证无论如何都能获得至少X个苹果,至少需要选择多少个盒子.数据满足n<=50. 首先第一个方面,如果我们选择的盒子的下限大于等于X,那么显然我们一定可以获得那么多的苹果, 所以我们将盒子的下限排序,然后从大到小累加即可. 另一方面,如果我们没有选择的盒子的上限小于等于S-X,那么显然我们也一定可以获得那么多的苹果, 于是我们再按照上限排序

Topcoder SRM 605 div1 题解

日常打卡- Easy(250pts): 题目大意:你有n种汉堡包(统统吃掉-),每一种汉堡包有一个type值和一个taste值,你现在要吃掉若干个汉堡包,使得它们taste的总和*(不同的type值的个数)乘积越大,输出这个最大值.数据满足n<=50,type<=100,abs(taste)<=100000. 这题好像是个贪心,才不是呢啊哼- 首先我们发现,如果若干个汉堡包有同一个type值,那么我们可以把这一些汉堡包看成一个新的大汉堡包,它的type就是原来的type,它的taste就

Topcoder SRM 604 div1题解

CTSC考完跑了过来日常TC--- Easy(250pts): 题目大意:有个机器人,一开始的位置在(0,0),第k个回合可以向四个方向移动3^k的距离(不能不动),问是否可以到达(x,y),数据满足|x|,|y|<=10^9. 这题还是很简单的嘛,口亨--- 首先我们只考虑一个方向,于是发现,每一次可以移动3^k的距离或者不动,于是我们发现这样的序列是有且仅有一个的, 于是我们分开考虑x和y,把两个序列全部预处理出来, 然后直接扫一遍就做完了, 时间复杂度O(log|x|)左右吧,代码如下:

TopCoder SRM 625 Incrementing Sequence 题解

本题就是给出一个数k和一个数组,包括N个元素,通过每次增加数组中的一个数的操作,最后需要得到1 - N的一个序列,不用排序. 可以从暴力法入手,然后优化. 这里利用hash表进行优化,最终得到时间效率是O(n*n)的算法,而且常数项应该很低,速度还挺快的. 思路: 1 如果数组A[i]在1 -N 范围内,就利用bool B[]记录,这个数已经找到了: 2 如果A[i]的值之前已经找到了,那么就增加k操作,得到新的值A[i]+k,看这个值是否找到了,如果没找到,就使用B记录,如果之前已经找到了,那

Topcoder SRM 刷题企划

1.本文用来记录自己在Topcoder上刷过的题目.不过重点是记录心得,记录自己的思路问题. 2.刷的题目全部都是Div2 1000分的题目,小概率会去做Div1 的进阶题. 3.基本上自己写出来的题目都不会另开一篇来写. 4.Topcoder使用: [教程1][教程2] SRM 508 Div2 YetAnotherORProblem (Div2 Hard) 题意:构造长度为N,各元素上限为R的序列,并且满足$A_1+A_2+\cdots+A_n=A_1|A_2|\cdots|A_n$,求方案

2015 ACM-ICPC 北京赛区 网络赛 部分 题解

由于博主水平及智商不足,所以暂时只能放出下列的题目的题解. A B D F G H 需要其他题解请自行前往 http://talk.icpc-camp.org/ 题目地址:hihocoder 1227-1236 A.  The Cats' Feeding Spots 题意:给出M个点,求以其中一个点为圆心,最小半径的圆,使得这个圆里恰好有N个点. (半径一定要是整数,且点不能恰好在圆上). 方法:暴力,稍微注意一下精度什么的就好了,1A. 1 #include <bits/stdc++.h>

Floyd-Warshall+二进制枚举SRM 661 Div2 Medium: BridgeBuilding

SRM 661-Medium: BridgeBuildingDiv2  Problem Statement You have two rows of nodes. Each row contains N nodes, numbered 0 through N-1 from the left to the right. Within each row, adjacent nodes are already connected by edges. You are given the lengths