[Updating] Codeforces Round #404 (Div. 2) 解题报告

本文解析了四道ACM编程题,包括简单的计数问题、区间覆盖问题、数学计算问题及一个涉及组合数学的字符串问题。通过具体示例介绍了如何使用C语言结构体和基本算法解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A-Anton and Polyhedrons
大水题

//Author: Lixiang
#include<stdio.h>
struct Anton_and_Polyhedrons{
    char s[100];
    void init(){
        int ans=0,N;
        scanf("%d",&N);
        while(N--){
            scanf("%s",s);
            switch(s[0]){
                case 'T':ans+=4;break;
                case 'C':ans+=6;break;
                case 'O':ans+=8;break;
                case 'D':ans+=12;break;
                case 'I':ans+=20;break;
            }
        }
        printf("%d\n",ans);
    }
}sol;
int main(){
    sol.init();
    return 0;
}

B-Anton and Classes

大水题

//Author: Lixiang
#include<stdio.h>
int max(int a,int b){
    return a>b?a:b;
}
int min(int a,int b){
    return a<b?a:b;
}
struct Anton_and_Classes{
    int N,M,L,R,mal1,mir1,mal2,mir2;
    void init(){
        mal1=mal2=0;
        mir1=mir2=1000000000;
        scanf("%d",&N);
        for(int i=1;i<=N;i++){
            scanf("%d%d",&L,&R);
            mal1=max(mal1,L);
            mir1=min(mir1,R);
        }
        scanf("%d",&M);
        for(int i=1;i<=M;i++){
            scanf("%d%d",&L,&R);
            mal2=max(mal2,L);
            mir2=min(mir2,R);
        }
    }
    void work(){
        int ans=max(mal1-mir2,mal2-mir1);
        if(ans<0)ans=0;
        printf("%d\n",ans);
    }
}sol;
int main(){
    sol.init();
    sol.work();
    return 0;
}

C-Anton and Fairy Tale
稍微计算一下就出来了
如果N<=M直接输出N
如果N>M,找最大的X使得 x(x1)2<NM
答案就是X+M

//Author: Lixiang
#include<stdio.h>
#include<math.h>
struct Anton_and_Classes{
    long long N,M,T;
    void init(){
        scanf("%I64d%I64d",&N,&M);
    }
    void work(){
        if(N<=M){
            printf("%I64d\n",N);
            return ;
        }
        T=N-M;
        T=sqrt(2*T);
        N-=M;
        while(T*(T+1)<2*N)T++;
        T+=M;
        printf("%I64d\n",T);
    }
}sol;
int main(){
    sol.init();
    sol.work();
    return 0;
}

D-Anton and School - 2
这题没做出来啊,厚颜无耻看了别人题解,搬运一下吧

题意:给出一个只有”(“和“)”的字符串,为有多少个子序列,它的长度为len,则左边len/2个字符为”(“右边len/2个字符为”)”,问这样的子序列有多少个。

前缀的后缀、 范德蒙恒等式
子串为 前缀的后缀,这里是子序列,所以s[i]为必取,作为序列的最后一个元素,然后前面的”(“为选取,
所以可以预处理出suml和sumr,分表表示i的左边有多少个”(“, i的右边有多少个”)”.
然后对于每个“(“,必选这一个”(“,然后i之前的(进行排列组合,选j个”(“,就在sumr[i+1]里选j个”)”。
所以就是 CjaCjb 类型的组合数,然后这里恰好有个叫做范德蒙恒等式的公式,

i=0mCinCim=Cmn+m(mn)

然后根据上面所描述的方法,每次i是必选的,然后进行排列组合。
ans += C(suml[i] + sumr[i+1], suml[i]) - C(suml[i] - 1 + sumr[i+1], suml[i] - 1) = C(suml[i] + sumr[i+1] - 1, sum[i]);

代码就先不放了,自己写完再放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值