新生训练赛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;
}