新生训练赛补题

新生训练赛02补题

##a题(待补)
##b题(待补)
##c题(待补)
##d题
想法:一开始拿到题我想到的是贪心,每一个从最小的开始吃,然后我发现不行。。。。其实最重要的就是需要充分利用糖果,所以先对每一个糖果进行比较大小,我用的方法是讨论比较。。。。。后来在题解中发现sort这就很简单了。但是我没想到。。。

#include<iostream>
#include<math.h>
#include<cstdio>
using namespace std;
int main()
{
	 int t,r,g,b,k,x,y,z;
	 long long s;
	 cin>>t;
	 for(int i=0;i<t;i++){
	 	cin>>r>>g>>b;
	 	if(r>=g&&g>=b){
	 		x=r;y=g;z=b;
		 }
		 else if(r>=b&&b>=g){
		 	x=r;y=b;z=g;
		 }
		 else if(g>=r&&r>=b){
		 	x=g;y=r;z=b;
		 }
		 else if(g>=b&&b>=r){
		 	x=g;y=b;z=r;
		 }
		 else if(b>=g&&g>=r){
		 	x=b;y=g;z=r;
		 }
		 else if(b>=r&&r>=g){
		 	x=b;y=r;z=g;
		 }
		k=x-y;
		if(k>z){
			s=z+y;
		} 
		else if(k==z){
			s=x;
		}
		else if(k<z){
			z-=k;x-=k;
			int num=z/2;
			x-=num;y-=num;
			s=k+2*num+y;
		} 
		   cout<<s<<endl;
	}

	return 0;
} 

##E题(待补)
##f题(待补)
##g题
想法:我之前是想找到一个01,因为每一次都是很严格的输入的01;一开始想到的是每一次去到一个连着的01然后最后剩下的如果是01那么就是如果不是就输出NO

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int main()
{
	int n,i;
	char str[1005];
	cin>>n;
	while(n--){
			cin>>str;int k=strlen(str);i=0;
		while(str[2]!='\0'){
			if(str[i]=='0'&&str[i+1]=='1'){
			    for(int j=i;j<=k-2;j=j++){
			        str[j]=str[j+2];
		    	}
		    	i=0;k-=2;
	    	}
	    	else
	    	i++;
        }     	
	if(str[0]=='0'&&str[1]=='1')
			cout<<"YES"<<endl;
	else
			cout<<"NO"<<endl;
	}
	return 0;
}

我总觉得它是对的但是却输出了runtime error;我很是不理解。。。。然后参考了题解写了如下代码

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int n,number=0;
	char  str[1005];
	cin>>n;
	getchar();
	for(int i=0;i<n;i++){
		gets(str);number=0;
		for(int j=0;str[j]!='\0';j++){
			if(str[j]=='0')
			  number++;
			if(str[j]=='1')
			   number--;
			if(number<0)
			   break;
		}
	    if(number==0)
	      cout<<"YES"<<endl;
	    else
		  cout<<"NO"<<endl;
		
	}
}
 

原来只要将遇到0加一遇到一减一,中途如果遇到小于零则输出NO而最后如果=0就是yes否则就是NO这样就行了
##h题(待补)

i题

想法:通过数组记录数字的每一位,每一位只是零或者一;数组第一位只能是一,如果小于输入的n则number加一
代码:

#include<iostream>
#include<cstdio>
using namespace std;
int a[15],number=0,n;
long long sum=0;
int Find(int s[],int time)
{
    s[time]=0;sum=s[0];        //给数组下一个赋值为零
	for(int i=1;i<=time;i++){
		sum=sum*10+s[i];
	}
	if(sum<=n){              //如果满足number++并使下标加一;为下一个下表赋值 
		// printf("%d\n", sum);
		number++;
		Find(s,time+1);
	}
	else
		return number;
	s[time]=1;sum=s[0];
	for(int i=1;i<=time;i++){
		sum=sum*10+s[i];
	}
	if(sum<=n){
		// printf("%d\n", sum);
		number++;
		Find(s,time+1);
	}
	else
		return number;
}
int main()
{
	int k=0,t;
	while(cin>>n){
		k=0;number=0;a[0]=1;             //数组第一个只能是一
		number++;
		k++;
		Find(a,k);
		cout<<number<<endl;
    }
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值