Codeforces Round #354 (Div. 2) B. Pyramid of Glasses (模拟+思维)

原题请戳这里

题意:

将杯子摆成杨辉三角状,即顶层1个杯子,第二层2个杯子,……第N层N个杯子。

每一秒能倒满1个杯子,每次一个杯子满了,酒会平分得流入它下面支撑它的两个杯子中。

如下图所示。1 ≤ n ≤ 10, 0 ≤ t ≤ 10 000。

分析:由于n很小,所以直接模拟此过程,其实也是一个递推的过程。

注意,如果递推的时候没有递推到n+1层,那么最后统计的时候是统计>=1的个数而不是==1的个数,

因为当酒能倒满的杯子大于n层杯子即n*(n+1)/2<t时,递推过程终止于n层,不能向下推了。故最下面

的一层酒是大于1的。代码如下:

#include<cstdio>
#include<map>
#include<algorithm>
#include<iostream>
#include<set>
#include<cmath>
#include<cstring>

using namespace std;

typedef long long ll;

double p[12][12];

int main()
{
    int n,t;
    while(~scanf("%d%d",&n,&t))
    {
        memset(p,0,sizeof(p));
        for(int i=1;i<=t;i++)
        {
            p[1][1]+=1;
            for(int j=1;j<n;j++)
            {
                for(int k=1;k<=j;k++)
                {
                    //cout<<j<<‘ ‘<<k<<endl;
                    if(p[j][k]>1)
                    {
                        p[j+1][k] += (p[j][k]-1)/2;
                        p[j+1][k+1] += (p[j][k]-1)/2;
                        p[j][k] = 1;
                        //cout<<i<<endl;
                        //cout<<j+1<<‘ ‘<<k<<‘ ‘<<p[j+1][k]<<endl;
                        //cout<<j+1<<‘ ‘<<k+1<<‘ ‘<<p[j+1][k+1]<<endl;
                    }
                }
            }
        }
        int cnt = 0;
        for(int j=1;j<=n;j++)
        {
            for(int k=1;k<=j;k++)
            {
                if(p[j][k]>=1)
                    cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

若递推到n+1层,则统计的是==1的个数。

#include<cstdio>
#include<map>
#include<algorithm>
#include<iostream>
#include<set>
#include<cmath>
#include<cstring>

using namespace std;

typedef long long ll;

double p[12][12];

int main()
{
    int n,t;
    while(~scanf("%d%d",&n,&t))
    {
        memset(p,0,sizeof(p));
        for(int i=1;i<=t;i++)
        {
            p[1][1]+=1;
            for(int j=1;j<=n;j++)  //<=n保证递推到n+1层
            {
                for(int k=1;k<=j;k++)
                {
                    if(p[j][k]>1)
                    {
                        p[j+1][k] += (p[j][k]-1)/2;
                        p[j+1][k+1] += (p[j][k]-1)/2;
                        p[j][k] = 1;
                    }
                }
            }
        }
        int cnt = 0;
        for(int j=1;j<=n;j++)
        {
            for(int k=1;k<=j;k++)
            {
                if(p[j][k]==1)  //
                    cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

时间: 2024-10-20 20:49:12

Codeforces Round #354 (Div. 2) B. Pyramid of Glasses (模拟+思维)的相关文章

Codeforces Round #354 (Div. 2) - B. Pyramid of Glasses

/* 队友告知的题意,大概是 杯子如题摆放,有 n 层 .最上面那个杯子一秒钟可以装满, 给出 n 和时间 t ,问 t 秒后可以装满多少个杯子. 大致思路是 使用二维数组模拟杯子往下漏水的过程. 最后扫一遍数组计算容量大于 1 的个数 . */ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> using name

Codeforces Round #354 (Div. 2) ABCD

Codeforces Round #354 (Div. 2) Problems # Name     A Nicholas and Permutation standard input/output 1 s, 256 MB    x3384 B Pyramid of Glasses standard input/output 1 s, 256 MB    x1462 C Vasya and String standard input/output 1 s, 256 MB    x1393 D T

Codeforces Round #417 (Div. 2) A. Sagheer and Crossroads 模拟 枚举

Codeforces Round #417 (Div. 2) A. Sagheer and Crossroads 模拟  枚举 题意 一个红绿灯 按逆时针方向一次给出各个路口的左转,直行,右转,以及行人车道让你判断,汽车是否有可能撞到行人 注意 当前车道的左转有可能撞到别的车道的行人的 题解 一大堆特判 1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring&g

Codeforces Round #480 (Div. 2) C 贪心 D 数字、思维 E 树上倍增

Codeforces Round #480 (Div. 2) C. Posterized 题意: 给出 n 个数,都是区间 [0,255] 内的数,要你把 [0,255] 划分成多个长度 <=k 的不重叠的子区间.每个数必须包含在一个子区间内,且这个数的价值是这个子区间的左端点.要你输出这 n 数的价值,且这 n 个价值字典序要最小. tags: 首先很明显字典序最小,那对于第 i 个数 p[i] 定它的区间时,左端点肯定要尽可能小.所以我们直接枚举区间 [ p[i]-k+1, p[i] ] 定

Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)

Problem  Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 1000 mSec Problem Description Input Output Sample Input 51 2 1 2 1 Sample Output 1 1 1 2 2 题解:这个题有做慢了,这种题做慢了和没做出来区别不大... 读题的时候脑子里还意识到素数除了2都是奇数,读完之后就脑子里就只剩欧拉筛了,贪心地构造使得前缀和是连续的素数,那

Codeforces Round #354 (Div. 2)

5/5 水了场CF,写个水水地题解~~ 题A CodeForces 676A 题意:给你一个排列,问你交换一次,最大最小位置最远是多少? 题解:暴力交换,暴力算,反正数据小.偷懒被hack更惨!! 1 /*zhen hao*/ 2 #include <bits/stdc++.h> 3 using namespace std; 4 5 #define lson l, m, rt*2 6 #define rson m + 1, r, rt*2+1 7 #define xx first 8 #def

Codeforces Round #354 (Div. 2) C. Vasya and String

题目大意:有一个(a|b)^N的由a和b构成的长度为N的字符串,允许修改其中k位.问能构成的最长的全为a或全为b的子串的长度最长为多少. 思路,用两个队列分别保存前K+1个a和b的位置,以i为结尾的最长的子串的长度就是i减去队列头元素的值. #include <iostream> #include <cstdio> #include <memory.h> #include <queue> using namespace std; int main(int a

Codeforces Round #354 (Div. 2) A

题目给出1~n的n个数的一个permutation,swap一次任意两个数,output 1 and n 之间的最大距离 记录1 and n的位置p,确定1的位置,移动n到位置1 and n,确定n的位置,移动1到位置1 and n,output max value. O(n). #include <cstdio> #include <cmath> #include <algorithm> using namespace std; int n; struct node{

Codeforces Round #272 (Div. 2) C. Dreamoon and Sums (数学 思维)

题目链接 这个题取模的时候挺坑的!!! 题意:div(x , b) / mod(x , b) = k( 1 <= k <= a).求x的和 分析: 我们知道mod(x % b)的取值范围为 1  - (b-1).那么我们可以从这一点入口来进行解题.. mod (x, b) = 1 时, x  =  b + 1, 2b + 1, 3b + 1..... a * b + 1. mod (x , b) = 2 时, x =  2b + 2, 4b + 2, 6b + 2, ..... 2a * b