首页 > 其他分享 >Educational Codeforces Round 147 (A-D)

Educational Codeforces Round 147 (A-D)

时间:2023-04-24 09:01:02浏览次数:34  
标签:147 Educational 数列 int 询问 Codeforces -- while 字符串

A. Matching

橘子熊:这题太简单了我不想写


题面

Description

给定给一个带问号的字符串,求有多少种可能的数字

Input
多次询问,一次一个字符串

Output
对于每次询问,输出可能的数字的总数

数据范围与约定

2e5次询问,单词询问不超过5个字符

思路

主要思路

签到题
大部分情况下,一个问号对答案的贡献的 X10 , 但是存在首位X9的特殊情况,以及前导零对应没有的情况,特判下就行。

完整代码

#include<bits/stdc++.h>
using namespace std ;
void solve(){
    string s ;
    cin>>s ; 
    int len = s.length() ; 
    int ans = 1 ;
    if( s[0] == '0' ){
        cout<<0<<endl ; return ; 
    }
    for( int i = 0 ; i < len ; ++i ){
        if( s[i] == '?' )ans *= 10 ; 
    }
    if( s[0] == '?' )ans = ans*9/10  ; 
    cout<<ans<<endl ; 
}
int main(){
    int t ;
    cin>>t ; 
    while( t-- )solve() ; 
    return 0 ; 
}

B. Sort the Subarray

fxs:哎呀,这道题你想复杂了


题面

Description

给定2个数列,第二个数列是第一个数列的部分排序,求题目要求的最大合法区间

Input
2个数列

Output
最大合法区间

数据范围与约定

1e4次询问,单词询问数列不超过2e5

思路

主要思路

考虑到我们一旦有一个合法区间,那么这个合法区间向左右扩展的条件是:a[i]=b[i]并且符合排序

进一步思考,我们此题可以从两头向中间找不同,当然存在相同的情况,我们再往外扩展,一定能够得到最大值

完整代码

#include<bits/stdc++.h>
using namespace std ;
inline int read(){
    int s=0 ; char g=getchar() ; while( g>'9'||g<'0')g=getchar() ; 
    while( g>='0'&&g<='9')s=s*10+g-'0',g=getchar() ; return s ; 
}
int a[200005] , b[200005]; 
void solve(){
    int n = read() ;
    for( int i = 1 ; i <= n ; ++i )a[i] = read() ;
    for( int i = 1 ; i <= n ; ++i )b[i] = read() ; 
    int l = 0 , r = n ;
    while( l <= n ){
        ++l ;
        if( a[l] != b[l] )break ; 
    }
    while( r >= 1 ){
        if( a[r] != b[r] )break ;
        r-- ; 
    }
    while( l > 1 ){
        if( b[l] >= b[l-1] && a[l-1] == b[l-1] ) l-- ; 
        else break ; 
    }
    while( r < n ){
        if( b[r] <= b[r+1] && a[r+1] == b[r+1]) r++ ; 
        else break ; 
    }
    cout<<l<<" "<<r<<endl ; 
}
int main(){
    int t = read() ; 
    while( t-- )solve() ; 
    return 0 ; 
}

C. Tear It Apart

开始后半个小时不到,橘子熊:我A了


题面

Description

对于一个只含有字母的字符串,每次操作可以删除多个非相邻的字符,问至少多少次操作后,字符串会变为一个全由一个字母组成的字符串

Input
多次询问,每次一个字符串

Output
对于每次询问,输出最少操作次数

数据范围与约定

1e4次询问,单词询问数列不超过2e5

思路

主要思路

考虑到操作是向下兼容的?,也就是说,我一个只需要 k 次操作可以完全处理的区间,k+1次也一定可以处理。那我们就要找到对于每一个区间限制的k

那么,什么限制了我们每一个区间的k值呢?

连续且需要删除的字符串

那么一个合理的思路就出来了:枚举留下哪个字母,计算需要删除的连续最大区间。最后对于每个字母的情况求一下最小值即可。

完整代码

#include<bits/stdc++.h>
using namespace std ;
int get_ans( int s ){
    int tot = 0 ; s-- ;  
    if( s == 0 )return 0 ;
    while( s ){
        tot++ ; 
        s /= 2 ; 
    }
    return tot ; 
}
void solve(){
    string s ;
    cin>>s ; 
    int mi_num[26] ;
    int len = s.length() ; 
    for( int i = 0 ; i < 26 ; ++i )mi_num[i] = -1 ; 
    int ans = (1<<30) ; 
    for( int c = 0 ; c < 26 ; ++c ){
        char g = 'a'+c  ;
        int las = 0 , l = 0 ; 
        while( l <= len ){
            ++l ;
            if( s[l-1] == g ){
                mi_num[c] = max( mi_num[c] , l-las ) ; las = l ;
            }
            else continue ; 
        }
        mi_num[c] = max( mi_num[c] , len-las+1 ) ; 
        ans = min( ans , mi_num[c] ) ; 
    } 
    cout<<get_ans(ans)<<endl ; 
}
int main(){
    int t ;
    cin>>t ; 
    while( t-- )solve() ; 
    return 0 ; 
}

D. Black Cells

ssw:快睡觉吧,明天再想

挖个坑,日后填

标签:147,Educational,数列,int,询问,Codeforces,--,while,字符串
From: https://www.cnblogs.com/ssw02/p/17348339.html

相关文章

  • Educational Codeforces Round 39 (Rated for Div. 2) -- D. Timetable (DP)
    写得很折磨人,每次dp都写个一个多小时,写出来明明觉得不难.题目大意:可以进行K次操作,把删除1,进行k次操作后每行第一个1和最后一个1的位置相减的绝对值加1得到的结果最小。做法:每次肯定是要从左删或者从右边删,然后顺着这个思路,先把每行的进行小于等于k次操作时,每行最小......
  • codeforces 559C Gerald and Giant Chess(dp+组合数学)
    题目链接:codeforces559C题目大意:给出一个h*r的矩阵,从左上角走到右下角,中间有一些点不能经过,问不同的路径有多少种?题目分析:首先我们考虑一个n*m的矩阵,从左上角只能向右或向下走能走到右下角的方案数,也就是C(n+m,n),就是一共要走n+m次,选出n次横着走。那么我们定义dp[i]表示在前不经......
  • codeforces 545C C. Woodcutters(dp+二分)
    题目链接:codeforces545C题目大意:给出一些树的位置和高度,每棵树可以砍倒,覆盖[xi−hi,xi]或者覆盖[xi,xi+hi],或者不砍倒,问最多砍倒多少棵树?题目分析:我们记录dp[i]表示选取到i棵树的时候用的最短的区间长度。每次枚举每棵树,二分到最大的不超过当前树位置的个数,然后利用当前树的信息......
  • codeforces 4D D. Mysterious Present(dp)
    题目连接:codeforces4D题目大意:给出n个信封,这n个信封有长和宽,给出卡片的尺寸,求取能够装入卡片的最长的序列,序列满足后一个的长和宽一定大于前一个,求最长的这个序列的长度,并且给出一组可行解。题目分析:一看这种题目就是dp的题目,状态定义dp[i]为以i结尾的序列的最大的长度,并且利用一......
  • codeforces 2B B. The least round way(dp+数论)
    题目链接:codeforces2B题目大意:给出一个n*n的矩阵,从左上角走到右下角,只能向右或向下走,问路径上的数之积末尾0最少的方案是什么。题目分析:首先我们要做两个预处理,处理出每个位置上的数包含多少个2的质因子和多少个5这个质因子然后我们统计路径上弄到最少的2的方案数和最少的5的方案......
  • codeforces 126B B. Password(kmp+dp)
    题目链接:codeforces126B题目大意:给出一个字符串,找出一个子串既是它的前缀,也是它的后缀,还是一个非后缀也非前缀的子串。题目分析:本来挺简单的一个题,最开始想复杂了,还用了后缀数组,醉了。这个题主要用的是kmp的next数组,首先我们要了解next数组的定义,next[i]表示以i为末尾的子串的后缀......
  • codeforces 118D D. Caesar's Legions(dp)
    题目链接:codeforces118D题目大意:给出n1个1,n2个2,给出k1和k2代表连续的1和2的最大长度,问能够构造的合法的不同串的数量。题目分析:能够递推,所以想到能够利用dp做。首先我们定义状态,dp[i][j][k][2]代表以1或2结尾,结尾相同的元素的数量为k,1的总数是j的当前序列长度为i的串的数量。首先......
  • codeforces 264B B. Good Sequences(dp+数论)
    题目链接:codeforces264B题目大意:给出n个数,利用这n个数构造一个好的序列,好的序列是单调增的,而且序列中相邻的两个元素都不互质,问最长的好序列的长度是多少。题目分析:首先我们定义状态dp[i]表示当前的数进行构造的序列末尾的数的质因数包含i的时候的最长的情况。然后我们从小到大枚......
  • codeforces 159D D. Palindrome pairs( manacher+dp )
    题目链接:codeforces159D题目大意:给出一个字符出,求取这个字符串中互相不覆盖的两个回文子串的对数。题目分析:首先能够用manacher模板,因为这个算法处理的字符串的长度式奇数,所以我们首先将原字符串拓展,也就是用一个没有出现过的子串填充到每两个字符之间,首位也要添加,这样处理后得到......
  • codeforces 359B B. Permutation(简单构造)
    题目链接:codeforces359B题目大意:给出n和k,要求构造一个长度为2*n的排列,满足如下的式子:∑i=1n|a2∗i−1−a2∗i|−|∑i=1na2∗i−1−a2∗i|=2∗k题目分析:首先最终构造的2*k一定是小于n的偶数,如果我们直接放入自然数的排列,结果是0,我们将2*i-1和2*i分为一组,每次调换组内位置(每组只能......