【日记】12.27/【题解】CF Edu79

12.27

CF Edu79

A.New Year Garland

题意:有r,g,b个红绿蓝色气球,现问是否可以排成一列,使得没有两个相邻气球颜色相同。

思路:如果最大值>两个小数+1,就挂了。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((l+r)>>1)
const int M=1e5+20;
struct Task{
    int a,b,c;
    void init(){
        scanf("%d%d%d",&a,&b,&c);
    }
    void run(){
        init();
        int mx=max(a,max(b,c)),sum=a+b+c;
        if (mx>sum-mx+1)
            printf("No\n");
        else
            printf("Yes\n");
    }
}t;
int main(){
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;++i)
        t.run();
    return 0;
}

B.Verse For Santa

题意:有n个片段,每个片段需要a[i]分钟,一共有s分钟,必须从头开始按顺序念,但可以skip掉一个。问为了念出最多的片段,需要删掉哪一个?

思路:一万个假算法。其实很简单,先不skip,找到临界点,那么要么skip第一个念不完的,要么skip掉前面最大的,选最大的那个skip就行了。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((l+r)>>1)
const int M=1e5+20;
struct Task{
    int n,s,a[M];
    int mxp=0;
    void init(){
        mxp=0;
        scanf("%d%d",&n,&s);
        for(int i=1;i<=n;++i)
            scanf("%d",&a[i]);
        a[n+1]=0;
    }
    void run(){
        init();
        int p=1;
        while(p<=n&&a[p]<=s){
            s-=a[p];
            if (a[p]>a[mxp])
                mxp=p;
            ++p;
        }
        if (p>n||n==1)
            printf("0\n");
        else{
            if (a[mxp]>a[p])
                printf("%d\n",mxp);
            else
                printf("%d\n",p);
        }
    }
}t;
int main(){
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;++i)
        t.run();
    return 0;
}

C.Stack of Presents

题意:有一堆礼物,从上到下编号依次为a1,a2,……an。现在要顺次拿b1,b2,……,bn的礼物,每次拿都需要消耗2k+1秒,k是目标礼物上面的礼物个数。但每次拿一个礼物之后,可以把上面的礼物按任意顺序排序。现在问按顺序拿出所有礼物的最小时间是多少。

思路:可以想到,如果当前礼物在之前已经被搬动过,那么拿这个礼物的时间就是1,因为上次搬动它的时候,你一定能有办法把它安排到拿它的时候恰好在最顶上。所以直接设置指针和vis数组,如果没被访问过就往后找,找的过程中把翻过的全都在vis里面记录一下即可。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((l+r)>>1)
#define db(x) cout<<#x<<":"<<x<<endl;
const int M=1e5+20;
struct Task{
    int n,m,a[M],b[M],vis[M];
    void init(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i)
            scanf("%d",&a[i]),vis[i]=0;
        for(int i=1;i<=m;++i)
            scanf("%d",&b[i]);
    }
    void run(){
        init();
        LL ans=0;
        int p=1;
        for(int i=1;i<=m;++i){
            if (vis[b[i]])
                ++ans;
            else{
                while(p<=n&&a[p]!=b[i])
                    vis[a[p]]=1,++p;
                ans+=2*(p-i)+1;
            }
        }
        printf("%lld\n",ans);
    }
}t;
int main(){
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;++i)
        t.run();
    return 0;
}

D.Santa‘s Bot

题意:有n个孩子,每个孩子都有k个想要的礼物,每个礼物都有不同编号。现在有个算法,首先随机选一个孩子,之后从这个孩子的愿望清单里面随机选一个礼物,之后再随机选一个孩子,把刚刚那个礼物送给这个孩子。问有多少可能性,使得能送对。

思路:首先统计所有礼物被选中的概率,显然是读入的时候碰到一次就+\(\frac{1}{n}*\frac{1}{k}\)。之后由于最后一次也是随机选要送的人,所以把每种礼物的被选中的概率*想要它的孩子个数/n即可。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((l+r)>>1)
const int M=1e6+20,P=998244353;
int Inv[M];
void ln_Inv(int p){
    Inv[0]=Inv[1]=1;
    for(int i=2;i<=1e6;i++)
        Inv[i]=1LL*(p-p/i)*Inv[p%i]%p;
}
struct Task{
    int n,giftnum[M],giftprob[M];
    void run(){
        scanf("%d",&n);
        for(int i=1;i<=n;++i){
            int k;
            scanf("%d",&k);
            int prob=1LL*Inv[n]*Inv[k]%P;
            for(int j=1;j<=k;++j){
                int c;
                scanf("%d",&c);
                ++giftnum[c];
                giftprob[c]=(giftprob[c]+prob)%P;
            }
        }
        int ans=0;
        for(int i=1;i<=1e6;++i)
            ans=(ans+1LL*giftprob[i]*giftnum[i]%P*Inv[n]%P)%P;
        printf("%d\n",ans);
    }
}t;
int main(){
    ln_Inv(P);
    t.run();
    return 0;
}

原文地址:https://www.cnblogs.com/diorvh/p/12110224.html

时间: 2024-10-10 07:20:39

【日记】12.27/【题解】CF Edu79的相关文章

益计算Shprotification.v6.8.15.22+Heat.Balance.v6.12.27.36+Cold.Balance.v2.6.14.18

热增益计算Shprotification.v6.8.15.22+Heat.Balance.v6.12.27.36+Cold.Balance.v2.6.14.18 Andrey.Shirshov.Shprotification.v6.8.15.22 Andrey.Shirshov.Heat.Balance.v6.12.27.36 Andrey.Shirshov.Cold.Balance.v2.6.14.18   "现代ASHRAE标准参考数据用于从人.设备.确定热输入的人工照明,半透明的击剑系数(

12.26&amp;12.27 -正则表达式

12.26&12.27 正则表达式 第1章 使grep/egrep 过滤出的东西加上颜色 cat >>/etc/profile<<EOF alias grep='grep --color=auto' alias egrep='egrep --color=auto' EOF source /etc/profile alias grep egrep 第2章 正则表达式分类 2.1 基础正则表达式:basic    regular expression  BRE  ^  $  .

小白日记12:kali渗透测试之服务扫描(二)-SMB扫描

SMB扫描 Server Message Block 协议.与其他标准的TCP/IP协议不同,SMB协议是一种复杂的协议,因为随着Windows计算机的开发,越来越多的功能被加入到协议中去了,很难区分哪些概念和功能应该属于Windows操作系统本身,哪些概念应该属于SMB 协议.因为该协议很复杂,所以是微软历史上出现安全问题最多的协议. 1.Nmap 最简单的方法:扫描其固定开放的端口139,445,但是无法准确判断其为windows系统 [email protected]:~# <strong

2019/9/27 题解:【P3958】 奶酪

题解:[P3958]  奶酪 题目: 传送门:https://www.luogu.org/problem/P3958 AC代码:DFS 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 int n,outfg,cnt,anst; 8 double h

LeetCode(27)题解:Remove Element

https://leetcode.com/problems/remove-element/ Given an array and a value, remove all instances of that value in place and return the new length. The order of elements can be changed. It doesn't matter what you leave beyond the new length. 思路: 因为可以改变元

2018.12.27上午学习内容

1 # 列表的一些常用操作符 2 # 比较操作符,逻辑操作符,连接操作符,重复操作符,成员关系操作符 3 4 zfcd=80 5 6 b1=[123] 7 b2=[234] 8 jg=b1>b2 9 jg2=b1<b2 10 print(jg,"\n",jg2) 11 12 print ("="*zfcd) 13 b1=[123,456] 14 b2=[234,123] 15 jg=b1>b2 16 jg2=b1<b2 17 print(jg

BNU Training 2015 07 27 题解

[比赛链接]:click here~~ uva 12435 C. Consistent Verdicts [题目大意]:给你二维平面一些人的坐标,每个人手上都有一把枪,求全部人同时开枪后所有人听到枪声的次数的可能数目. [解题思路]:O(n^2)暴力枚举+unique 函数去重相邻元素.居然只跑了3ms,~~ 代码: <span style="font-size:14px;">// C #ifndef _GLIBCXX_NO_ASSERT #include <cass

分布式技术一周技术动态 2015.12.27

分布式系统实践 1. Kafka深度解析 http://www.jasongj.com/2015/01/02/Kafka%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90/ 要点: 这篇文章深入的讲解了kafka的架构设计, 数据复制算法以及kafka的性能等多个方面, 是理解和学习kafka非常难得的一篇好文章, 推荐给大家. 2. 解密阿里巴巴高可用架构技术——“异地多活” http://mp.weixin.qq.com/s?__biz=MzAwNjQwNzU2NQ==

2017/12/27

1.多态分为运行时多态和编译时多态,前者指父类的引用指向子类的对象,后者通过方法的重载:2.final修饰的方法不能被重写,修饰的类不能被继承:3.内部类可以调用外部类的成员,且只能被外部类调用:4.异常的三种方式,在方法上Throws抛出,try catch, 手动Throw;5.java的本质是数据核对数据的操作:6.获取构造器.方法和成员变量时,如果目标为private修饰,要先修改权限: 7. Class cls=Cat.class;@1 Object o=cls.newInstance