前三道相信大家肯定之前就做过了,所以就不放代码了。
7-4 打印沙漏 (20 分)
这个题就是找规律:第i行有i个空格(从0开始数),然后符号就用数组预处理一下(我喜欢先存在数组里)。两个数组,a记录每行多少个字符,sum记录上半部分共有多少个字符(不包含一个字符的那一行)。总的字符就是2*sum[k]+1;所以最后一行要输出的就是n-2*sum[k]-1。
#include<bits/stdc++.h>
using namespace std;
int a[31];
int sum[31];
void get1()
{
a[0]=1;
for(int i=1;i<=30;i++) a[i]=a[i-1]+2;
}
void get2()
{
for(int i=1;i<=30;i++) sum[i]=sum[i-1]+a[i];
}
int main()
{
get1();
get2();
int n;
char ch;
cin>>n;
cin>>ch;
int k;
for(int i=1;i<=30;i++)
{
if(sum[i]*2+1>n)
{
k=i-1;
break;
}
}
for(int i=0;i<k+1;i++)
{
for(int kong=0;kong<i;kong++) cout<<' ';
for(int j=1;j<=a[k-i];j++)
{
cout<<ch;
}
printf("\n");
}
for(int i=1;i<=k;i++)
{
for(int kong=0;kong<k-i;kong++) cout<<' ';
for(int j=1;j<=a[i];j++) cout<<ch;
cout<<endl;
}
cout<<n-2*sum[k]-1<<endl;
}
7-5 A-B (20 分)
好像天梯赛的题很喜欢出带空格字符串,输入格式为:scanf("%[^\n]",s);
大概就是拿个数组去把s2出现过的字母记录一下。
#include<bits/stdc++.h>
using namespace std;
bool a[150];
int main()
{
char s1[10001],s2[10001];
scanf("%[^\n]",s1);
char ch=getchar();
scanf("%[^\n]",s2);
int len1=strlen(s1);
int len2=strlen(s2);
for(int i=0;i<len2;i++)
{
a[(int)(s2[i])]=1;
}
for(int i=0;i<len1;i++)
{
if(a[(int)(s1[i])]==0) cout<<s1[i];
}
}
7-6 敲笨钟 (20 分)
遍历字符串然后找到 “ , “ 和 “ . ” ,判断他们的前三个字符是不是ong。
然后遍历一遍字符串,把后面的改为"qiao ben zhong. " 当时因为这个句号浪费了一点时间。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
char ch=getchar();
while(t--)
{
char s[1000];
scanf("%[^\n]",s);
char ch1=getchar();
int len=strlen(s);
int t1=0,t2=0;
for(int i=0;i<len;i++)
{
if(s[i]==',')
{
if(s[i-3]=='o'&&s[i-2]=='n'&&s[i-1]=='g') t1=1;
}
if(s[i]=='.')
{
if(s[i-3]=='o'&&s[i-2]=='n'&&s[i-1]=='g') t2=1;
}
}
if(t1*t2)
{
int cnt=0,vis;
for(int i=len-1;i>=0;i--)
{
if(s[i]==' ') cnt++;
if(cnt==3)
{
vis=i;
break;
}
}
for(int i=0;i<=vis;i++) cout<<s[i];
cout<<"qiao ben zhong."<<endl;
}else{
printf("Skipped\n");
}
}
}
7-7 前世档案 (20 分)
用l和r来表示范围 l到r,每遍历到一个字符范围就缩小一半,最后范围会被缩小到只有一个元素,就输出。然后这里面总元素个数是pow(2,n);
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int k=pow(2,n);
while(m--)
{
string s;
cin>>s;
int l=1,r=k;
for(int i=0;i<n;i++)
{
int mid=l+r>>1;
if(s[i]=='y') r=mid;
if(s[i]=='n') l=mid+1;
}
cout<<l<<endl;
}
}
7-8 这是二叉搜索树吗? (25 分)
二叉树没学,我不会。。 。