训练赛5(ICPC全国邀请赛—校内选拔赛 )
导语
运气好没有因罚时掉到第5,终于能出去打一次比赛
涉及的知识点
贪心、模拟、字符串、数学、DP、几何、思维、栈
题目
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[

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

被折叠的 条评论
为什么被折叠?



