训练赛5(ICPC全国邀请赛—校内选拔赛 )

本文介绍了多个编程竞赛中的题目,涉及贪心、模拟、字符串、数学、动态规划、几何等算法知识点。通过ACM-ICPC相关赛事的题目解析,展示了如何运用各种算法解决实际问题,包括字符串处理、数组操作、括号匹配、动态规划计算等。

导语

运气好没有因罚时掉到第5,终于能出去打一次比赛

涉及的知识点

贪心、模拟、字符串、数学、DP、几何、思维、栈

链接:ICPC全国邀请赛—校内选拔赛

题目

A( CodeForces 1276A )

题目大意:给出一个字符串s,去掉最少的字符使得该串中不存在连续三个字符能构成"one"或"two",输出每个去掉字符的位置,多种答案输出一种

思路:本来想使用KMP,但是发现本题给的模式串并不是对称的,而且很小,所以应该可以直接暴力,统计s中有几个two和one即可,对于twone这个字符串单独讨论

代码

#include <bits/stdc++.h>

using namespace std;
int len,t;
char str[2121212];
deque<int>Q;
int main() {
   
   
    scanf("%d\n",&t);
    while(t--) {
   
   
        scanf("%s",str+1);
        len=strlen(str+1);
        for(int i=1; i<=len; i++) {
   
   
            string tmp;
            for(int j=0; j<3; j++)//获取连续三个字符构成的字符串
                tmp+=str[i+j];
            if(tmp=="two") {
   
   
                Q.push_back(i+1);//存下标,去掉中间字符就行了
            }
            if(tmp=="one") {
   
   
                if(!Q.empty()&&Q.back()==-1) {
   
   
                    Q.pop_back();
                    continue;
                }
                Q.push_back(i+1);
            }
            for(int j=3; j<5; j++)
                tmp+=str[i+j];
            if(tmp=="twone") {
   
   
                Q.pop_back();
                Q.push_back(i+2);
                Q.push_back(-1);//存一个标记,代表需要去掉重复值,因为后面必定会扫一个one
            }
        }
        getchar();
        printf("%d\n",Q.size());
        len=Q.size();
        for(int i=0; i<len; i++) {
   
   
            printf("%d%c",Q.front(),i==len-1?'\n':' ');
            Q.pop_front();
        }
        if(len==0)
            putchar('\n');
    }
    return 0;
}

B(计蒜客 A1616 )

题目大意:两队lol队员,每队5人,每队可禁用5个英雄,共100个,先给出一个5*100的01矩阵代表我方拥有人物情况,s[i][j]表示第i个人是否有第j个人物,1有0无,询问共有多少种对局情况(敌方假定有全部人物)

思路:对局情况由四个部分组成:我方选择、敌方选择、我方禁止、敌方禁止,那么总对局数就等于这四部分之积,后三部分的积是可以求出的: A 95 5 × C 90 5 × C 85 5 A_{95}^5×C_{90}^5×C_{85}^5 A955×C905×C855,分别对应敌方选择,我方禁止,敌方禁止,经过计算与取余可以得到值为531192758,之后采用动态规划的方法来计算选择方案数,可得状态转移方程。

1.s[i][j]为0,dp[i][j]=dp[i][j-1],第j个人物没有,直接选下一个
2.s[i][j]为1,dp[i][j]=dp[i][j-1]+dp[i-1][j-1],第j个人物有,变成可选可不选,累和方案

对我方5人需要求全排列,然后每个排列进行一次dp,因为每个排列的不同也算一种方案

最后累和可选方案,乘计算取余的值即可

代码

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
char square[6][121];
ll dp[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值