CodeRorce- Prizes, Prizes, more Prizes

这个题目比较简单,但是有些细节。

比如:50个输入,每个都是10^9,但是奖品最高价格为5.

那么奖品5的数量将会超过int的表示范围,所以cnt要用unsigned long long类型。

#include <stdio.h>
#include <string.h>
typedef unsigned long long LL;
int n;
int points[60];
int cost[5];
LL cnt[5];
LL sum;
int main(){
    freopen("input.txt","r",stdin);

    while(scanf("%d",&n)!=EOF){
        memset(points,0,sizeof(points));
        memset(cost,0,sizeof(cost));
        memset(cnt,0,sizeof(cnt));
        sum=0;
        for (int i = 0; i < n; ++i){
            scanf("%d",&points[i]);
        }
        for (int i = 0; i < 5; ++i)
            scanf("%d",&cost[i]);

        for (int i = 0; i < n; ++i)
        {
            sum+=points[i];
            while(sum>=cost[0]){
                for (int j = 4; j >= 0; --j)
                {
                    int num = sum/cost[j];
                    if (num>=1)
                    {
                        cnt[j]+=num;
                        sum-=cost[j]*num;
                        break;
                    }
                }
            }
        }
        printf("%llu %llu %llu %llu %llu\n",cnt[0],cnt[1],cnt[2],cnt[3],cnt[4]);
        printf("%llu\n",sum);
    }
}
时间: 2024-10-12 12:42:53

CodeRorce- Prizes, Prizes, more Prizes的相关文章

SGU 495. Kids and Prizes( 数学期望 )

题意: N个礼品箱, 每个礼品箱内的礼品只有第一个抽到的人能拿到. M个小孩每个人依次随机抽取一个,  求送出礼品数量的期望值. 1 ≤ N, M ≤ 100, 000 挺水的说..设f(x)表示前x个人都选择完成后礼品剩下数的期望值( f(0) = N ), 那么f(x) = f(x - 1) - f(x - 1) / N = f(x - 1) * (N - 1) / N (显然). 那么答案就是等于 N - N * [(N - 1) / N]^M. 后面部分可以用快速幂优化.时间复杂度O(l

sgu 495 Kids and Prizes

计算出每个人得到礼物的概率,然后加起来即可 1 #include<iostream> 2 #include<string.h> 3 #include<algorithm> 4 #include<stdio.h> 5 using namespace std; 6 double dp[101010]; 7 int main(){ 8 int n,m; 9 while(cin>>n>>m){ 10 dp[1]=1; 11 for(int i

SGU 495 Kids and Prizes 概率dp

题意: 有N个箱子放有礼物,M个人依次取.如果取到的箱子有礼物,则拿走礼物.无论有没有拿到礼物,都将箱子原状放回.(所以就有可能后面的人拿到前面的人拿过的箱子,然后就没得到奖品).问,最后能拿走的礼物数量的期望. 两种思路,给跪了,,,还是没有想出来.... m个人是独立的. 对于每个礼物不被人选中的概率为((n-1)/n)^m 那么不被选中的礼物数的期望就是 n*((n-1)/n)^m 所以答案就是 n-n*((n-1)/n)^m; 这个地方自己老想着求1/n,结果没转过来...orz 概率d

codeforce 743D. Chloe and pleasant prizes 树dp

D. Chloe and pleasant prizes 题意:一颗以1为根的有根树,每个节点有点权,从中选出2个无相交的子树,使其权值和最大 思路:树dp裸题 dp[u][1] 记录以u为根 选一颗子树的最大值(包括u本身) dp[u][2]记录以u为根 选2颗树的最大值 dp[1][2] 即是答案 AC代码: #include "iostream" #include "string.h" #include "stack" #include &

Codeforces 743D:Chloe and pleasant prizes(树形DP)

http://codeforces.com/problemset/problem/743/D 题意:求最大两个的不相交子树的点权和,如果没有两个不相交子树,那么输出Impossible. 思路:之前好像也做过这种类型的题目啊,知道是树形DP,但是不知道怎么保证两个不相交.看别人代码之后, 在DFS回溯的时候, 1 void dfs(int u, int fa) { 2 sum[u] = w[u]; 3 for(int i = head[u]; ~i; i = edge[i].nxt) { 4 i

codeforces 743D - Chloe and pleasant prizes(树形DP)

题意 给一颗树取出两个不相互包含的子树使权值和最大 当然是选择DP辣~很容易想到枚举以每一个点为根的子树 找到对于这棵子树来说,之外的权值和最大的子树.第一遍dfs可以找出每个点的子树大小以及以每个点为根 所有子树的最大子树,以及这个子树所在的这个点的儿子节点,以及其他个儿子节点找一颗第二大子树. 所以对于每一个树来说,与它对应的最大的  另一棵最大权值子树    在父亲节点对应的最大权值子树    以及    父亲节点的另外孩子包含的最大子树上(感觉有点绕== #include <cstdio

SGU495 Kids and Prizes 概率DP,期望公式

题目 这题目首先进去以后,没地方提交,第一次做SGU的题目,只能在HUSTOJ上提交了 有n个盒子,里面有礼物的,m个人,每个人拿,拿过以后 把礼物取出来 把盒子放回去,求选中礼物数的期望 其实一开始就假设方程 dp[i]为 第i个人获得礼物的概率,但是状态转移方程不知道该怎么办,想了很久都没有办法, 其实首先边界为dp[1] = 1 第一个上来选的人肯定必中 接下来一个人的 则由两部分组成,dp[i] = (1 - dp[i - 1]) * dp[i - 1] + .........,因为上一

SGU 495 Kids and Prizes 概率DP 或 数学推理

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=495 有n个箱子 m个人 有两个思考的角度 1.从箱子的角度 对于一个箱子来说 不被选中的概率是((n-1)/n)^m 所以被选中的概率是(1 - ((n-1)/n)^m) 箱子之间是互相独立的 所以总期望是:n * (1 - ((n-1)/n)^m) [我是算样例然后无意中发现的规律 再证明] 2.从人的角度 从题目中看 人是one by one进去选的 所以可以看作有先后顺序 考虑动态

SGU 495. Kids and Prizes 期望

n个盒子 m个人轮流选 拿走盒子里的奖品 盒子再放回去 求得到奖品的期望 可以求没有被选到的奖品的期望 用n减去就是答案 #include <stdio.h> #include <iostream> #include <algorithm> #include <math.h> using namespace std; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF)