zoukankan      html  css  js  c++  java
  • 牛客网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;
    }
    
  • 相关阅读:
    changing a pointer rather than erasing memory cells
    验证码识别 edge enhancement 轮廓增强 region finding 区域查找
    Manipulating Data Structures
    passing parameters by value is inefficient when the parameters represent large blocks of data
    Aliasing 走样
    Artificial Intelligence Research Methodologies 人工智能研究方法
    Thread safety
    include pointers as a primitive data type
    flat file
    functional cohesion
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781860.html
Copyright © 2011-2022 走看看