A
错误做法:
用scanf输入错误,scanf不能输入空格,中间代码部分行不通。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char c[20];
scanf("%s",&c);
int n=sizeof(c),a;
for(int i=0;i<n;i++)
{
if(c[i]==' ') a=i+1;
}
for(a;a<sizeof(c);a++)
printf("%c",c[a]);
cout<<endl;
for(int i=0;i<n;i++)
{
printf("%c",c[i]);
if(c[i]==' ')
break;
}
return 0;
}
正确做法:
思路:直接将空格两边分成两个字符串,倒过来输出即可达成要求。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
cout<<b<<endl<<a;
return 0;
}
B
错误做法:
当时只想到了每次拆的包数都一样的情况,别的情况没想到怎么做。
#include<iostream>
using namespace std;
int main()
{
int n,x,k;
cin>>n>>x>>k;
int cnt=n*x/k;
cout<<cnt<<endl;
if(k%x==0)
{
for(int i=0;i<cnt;i++)
cout<<k/x<<' ';
}
else if(cnt=2)
cout<<k/x+1<<' '<<n-1-k/x;
return 0;
}
正确做法:
#include<iostream>
using namespace std;
int main()
{
int n,x,k;
cin>>n>>x>>k;
int cnt=n*x/k;
cout<<cnt<<endl;
n--;
int d=1; //定义第一次打开袋数
int l=x; //每次有的汤圆数
while(n>=0){
if(l<k){
n--;
l+=x;
d++;
}
else {
cout<<d<<" ";
d=0;
l=l-k; //每次剩下汤圆数
}
}
return 0;
}
C
这个题当时自己做的时候不太会,看了题解,发现了两种做法。
第一种很简便,很快捷,我觉的很厉害,思路是计算其中1的个数,如果没有分数为0,如果有1个,分数为1,其他的就是所有1的个数总和减1就是分数。可以通过题目中所举的事例,不过我觉得对于111100011行不通。
#include<bits/stdc++.h>
using namespace std;
int main(){
int res=0,q=0;
string s;
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]=='1'){
res++;
q=1;
}
else if(res>1)res--;
if(res<=1)res=1;
}
if(q==0)res=0;
cout<<res;
return 0;
}
第二种做法是得到最大分数第一个数应该是1,找到第一个1,然后计算后面后缀,从后往前算得到的最大数与1相加,就是分数。对于所有例子都可以通过。
#include<stdio.h>
#include<string.h>
int main()
{
char a[100001];
gets(a);
int count=0,i,j,p;
for(i=0;i<strlen(a);i++)
{
if(a[i]=='1')
{
p=i;
break;
}
}
if(i==strlen(a))
{
printf("0");
return 0;
}
int max=count=1;
for(j=strlen(a)-1;j>p;j--)
{
if(a[j]=='1')
count++;
else
count--;
if(count>max)
max=count;
}
printf("%d",max);
return 0;
}