• 牛客网36-A,B题解


    A.Rabbit的字符串

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    Rabbit得到了一个字符串,她的好朋友xxx可以给这个字符串施加一次魔法。

    魔法可以选择字符串的任一位置,并将该位置后面的所有字符水平拼接到串首。

    例如:对于字符串abcde,可以通过施加魔法得到cdeab。

    如果xxx通过施加魔法将字符串的字典序变得严格比之前的小,那么他将拿走这一字符串。

    Rabbit想知道自己的字符串会不会被xxx拿走。

    输入描述:

    第一行一个整数n,表示字符串的长度。
    
    接下来一行一个长度为n的只由小写字母组成的字符串。

    输出描述:

    如果Rabbit的字符串会被xxx拿走,输出“YES”。
    否则输出“NO”。
    (不输出引号)

    示例1

    输入

    复制

    5
    cdeab

    输出

    复制

    YES

    说明

    xxx可以把e之后的部分“ab”放到串首,得到abcde,字典序比cdeab小,故将拿走字符串。

    示例2

    输入

    复制

    5
    abcde

    输出

    复制

    NO

    备注:

    1≤n≤100000
    
    字典序的说明:https://en.wikipedia.org/wiki/Alphabetical_order

    思路:此题的想法是我的i想法是直接找后边是否存在比它小的,但是我们要考虑相等的时候,比如,abcab,这样也可以,我们可以试着将相等的复制到一个新的串中,然后拼接一下,但是我是水了一下他的数据

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    
    using namespace std;
    char str[100005];
    
    int main()
    {
    	
    	int n;
    	cin>>n;
    	scanf("%s",str);
    	int flag=0;
    	for(int t=1;t<n;t++)
    	{
    		if(str[t]<str[0])
    		{
    			flag=1;
    		  cout<<"YES"<<endl;
    		  return 0;
    		}
    	}
    	char str1[100005];
    	for(int t=1;t<n;t++)
    	{
    		if(str[t]==str[0]&&str[t+1]<str[1]&&str[t+2]<str[2])
    		{
    			flag=1;
    			cout<<"YES"<<endl;
    			return 0; 
    		}
    	}
    	if(flag==0)
    	{
    		cout<<"NO"<<endl;
    	}
    	return 0;
    	
    	return 0;
     } 

    B.Rabbit的工作(1) 

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    Rabbit大学毕业后找到了一份实习工作,如果实习通过她就转正了。
    实习期共有N天,其中有几天公司集体放假,Rabbit不用上班,剩下时间她可以选择工作或者休息。Rabbit工作总是越来越累,可是每当她休息时,她就重新充满了能量。简而言之,Rabbit第一天工作时这一天会消耗体力1,连续第二天工作时这一天会消耗体力2,连续第三题工作时这一天会消耗体力3,以此类推......每当她休息后,工作的第一天又会消耗体力1。
    为了让boss满意,Rabbit想工作尽量多的天数,但是懒惰的Rabbit又想让自己的总体力消耗不超过K。 

    输入描述:

    第一行两个整数N,K。
    
    第二行一个长度为N的01字符串。如果第i个字符为‘1’,表示这一天Rabbit可以选择工作或者休息,否则这一天Rabbit放假。

    输出描述:

    输出Rabbit最多能工作的天数。

    示例1

    输入

    复制

    4 2
    1011

    输出

    复制

    2

    说明

    第三天和第四天里面休息一天即可,总体力消耗为2

    备注:

    1<=N<=400
    
    1<=K<=N∗(N+1)/2

    思路:可以用dp来做

    设d[ i ][ j ][ p ]为在 i 天时,一共工作了 j 天,且连续工作了 p 天直到第 i 天时花费的最小体力。那么转移方程很简单:

    如果第 i 天我不工作,那么对于所有的合法的 p,d[ i ][ j ][ 0 ]=max( d[ i-1 ][ j ][ p ] ),如果我第 i 天工作,那么对于所有合法的 j 和 p,d[ i ][ j ][ p ]=d[ i-1 ][ j-1 ][ p-1 ]+p,然后对于所有的d[ i ][ j ][ p ]<=k,取一个最大的 j 当答案即可。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int d[405][405][35],n,k,ans;
    char s[160000];
    int main()
    {
    	cin>>n>>k>>s+1;
    	memset(d,-1,sizeof(d));
    	d[0][0][0]=0;
    	for(int i=1;i<=n;i++)
    	{
    		if(s[i]=='1')
    		{
    			for(int j=1;j<=n;j++)
    			for(int p=1;p*(p+1)/2<=n;p++)
    			if(d[i-1][j-1][p-1]!=-1)
    			{
    				d[i][j][p]=d[i-1][j-1][p-1]+p;
    				if(d[i][j][p]<=k)
    				ans=max(ans,j);
    			}
    		}		
    		for(int j=0;j<=n;j++)
    		for(int p=0;p*(p+1)/2<=n;p++)
    		if(d[i-1][j][p]!=-1)
    		{
    			if(d[i][j][0]==-1)d[i][j][0]=d[i-1][j][p];
    			else
    			d[i][j][0]=min(d[i-1][j][p],d[i][j][0]);
    			if(d[i][j][0]<=k)
    			ans=max(ans,j);
    		}
    	}
    	cout<<ans;
    }
    
  • 相关阅读:
    ffmpeg视频操作记录
    frida定义线程写图片文件
    frida创建静态域
    frida创建字符串
    pyppeteer_stealth
    python ast
    最小的js编译器
    excel加双引号和逗号
    JUnit 单元测试方法中启用子线程的问题
    ctrip 开源 DAL 框架相关问题总结
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781860.html
Copyright © 2020-2023  润新知