【#253_DIV2】-A B D

本文提供了CodeForces 443比赛中的A、B、D题的详细解答,包括问题描述、解题思路及代码实现,涵盖了字符串处理、概率计算等方面的技术细节。

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

题目链接:http://codeforces.com/contest/443

A题-Anton and Letters

水题,不解释

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

char str[1200];
int vis[1000];

int main()
{
    int i;
    memset(vis,0,sizeof(vis));
    gets(str);
    for(i=0;i<strlen(str);i++)
    {
        //cout<<str[i]<<endl;
        if(str[i]>='a' && str[i]<='z')
        {
            vis[str[i]]=1;
        }
    }
    int ans=0;
    for(i=0;i<1000;i++)
        if(vis[i])ans++;
    cout<<ans<<endl;
    return 0;
}



B题-Kolya and Tandem Repeat

一个长s的字符串,可以往右侧加上k个任意字符,问新串的最长“重复子串”有多长?

原字符串里都是小写字母,先把k个“0”加到字符串上,“0”代表可以是任意字母

然后根据题目中对于重复子串的定义:

A tandem repeat of length 2n is string s, where for any position i (1 ≤ i ≤ n) the following condition fulfills: si = si + n.

利用 si = si + n. 来直接暴力寻找最长重复子串就行了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

char str[500];

int main()
{
    freopen("input.txt","r",stdin);
    int i,j,k;
    scanf("%s",str);
    int slen=strlen(str);
    cin>>k;
    int len=slen+k;
    for(i=slen;i<len;i++)
        str[i]='0';
    int from,to,ans=-1;
    for(from=0;from<slen;from++)
    {
        for(to=from+1;to<len;to+=2)
        {
            int n=(to-from+1)/2;
            int flag=1;
            for(i=from ;i <= (to-from)/2+from ;i++)
            {
                if(str[i]==str[i+n]||str[i+n]=='0')continue;
                else
                {
                    flag=0;break;
                }
            }
            if(flag) ans=max(ans,2*n);
        }
    }
    if(k>=slen) ans=k+slen-(k+slen)%2;
    else
        ans=max(ans,2*k);
    cout<<ans<<endl;
    return 0;
}



D题-Andrey and Problem

向n个人中的若干人寻求帮助,每个人有 Pi 的可能性提供帮助,我们想要有且只有一个人提供帮助,获得帮助的最大可能性是多少?(在选择最优的询问人员情况下)

事实上,是有数学规律的,先把这些人的可能性从大到小排序,然后如下:

①-- 第一个人的可能性就是只问一个人的最大可能性。

②-- 问前两个人的成功可能性就是只问两个人的最大可能性。

③-- 问前n个人的成功可能性就是只问n个人的最大可能性。

从以上数值中选取最大的就是答案。不知道为什么,但你试一下真是对的,我差那么一点点就想到了,真是郁闷!

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

double arr[200];

bool cmp(double a,double b) { return a>b;}

int main()
{
    int n,i,j,k;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    sort(arr,arr+n,cmp);
    double ans=-1;
    for(i=0;i<n;i++)
    {
        double tans=0;
        for(j=0;j<=i;j++)
        {
            double t=1;
            for(k=0;k<=i;k++)
            {
                if(k==j) t*=arr[k];
                else t*=(1-arr[k]);
            }
            tans+=t;
        }
        ans=max(ans,tans);
    }
    printf("%.12f\n",ans);
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值