A - 必做题11-1
解题思路
- 比较积蓄和房价,积蓄大于等于房价或大于20年了即停止,比较当前积蓄和房价,按要求输出
- 当房价每年的增幅超过每年的工资,此时积蓄还小于房价,则不可能买下。
完整代码
#include<iostream>
using namespace std;
int main()
{
int K,N,num;
double price;
cin>>N>>K;
num=N;
price=200;
int M=1;
while(M<=20)
{
if(num>=price)
{ cout<<M<<endl;
return 0;}
if(price * K/100.0 > N)
{ cout<<"Impossible"<<endl;
return 0;}
price= price*(K+100)/100.0;
M++;
num=num+N;
// cout<<"num"<<num<<" "<<"price"<<price<<endl;
}
}
B - 必做题11-2
解题思路
没什么技巧…只判断1即可,不需要管0,判断旧方阵通过4种旋转是否能得到新方阵
完整代码
//只判断1即可
#include<iostream>
using namespace std;
struct node
{
int x;
int y;
} o[410];
int teacher[21][21];
int main()
{
int n;
cin>>n;
int s;
int cnt=0;
for(int i=0;i<n;i++)
for (int l=0;l<n;l++)
{cin>>s;
if(s==1)
o[cnt].x=i,o[cnt].y=l,cnt++;
}
for(int i=0;i<n;i++)
for (int l=0;l<n;l++)
cin>>teacher[i][l];
//不需要
int flag=0;
for(int i=0;i<cnt;i++)
{ if(teacher[o[i].x][o[i].y]==1)
continue;
flag=1;
}
if(flag==0)
{ cout<<0<<endl;
return 0;
}
flag=0;
//90度
for(int i=0;i<cnt;i++)
{ if(teacher[o[i].y][n-o[i].x-1]==1)
continue;
flag=1;
}
if(flag==0)
{ cout<<1<<endl;
return 0;
}
flag=0;
//180度
for(int i=0;i<cnt;i++)
{ if(teacher[n-o[i].x-1][n-o[i].y-1]==1)
continue;
flag=1;
}
if(flag==0)
{ cout<<2<<endl;
return 0;
}
flag=0;
//270度
for(int i=0;i<cnt;i++)
{ if(teacher[n-o[i].y-1][o[i].x]==1)
continue;
flag=1;
}
if(flag==0)
{ cout<<3<<endl;
return 0;
}
cout<<-1<<endl;
}
C - 必做题11-3
解题思路
- 对每个字符段分别处理。
- 对需要调整的字符(字母)调整,逗号不管;
- 大于f就减5,否则”转一圈”,加21即可。
完整代码
#include <iostream>
#include<cstring>
using namespace std;
string s;
int main()
{
while(cin>>s)//对每个字符段分别处理
{
int len=s.length();
for(int i=0;i<len;i++)//对需要调整的字符调整,逗号不管
if(s[i]>='A'&&s[i]<='Z')//字母
if(s[i]>='F')//大于f减5
s[i]=s[i]-5;
else//否则转一圈
{
s[i]=21+s[i];
}
cout<<s<<" ";
}
return 0;
}
D - 必做题11-4
解题思路
- 本题即找最大长度的‘11…122…2’或者’22…211…1’
- 遍历整个数组(用两个指针),统计第一种数字连续的长度,再统计第二种数字连续的长度,取min;不断重复此过程,输出最大值即可。
完整代码
#include<iostream>
#include<algorithm>
using namespace std;
int s[100010];
int main()
{
int n;
int left=0;
int right=0;
int Min=100010;
int Max=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>s[i];
int mid=0
;
if(s[0]==1)
while(right<n)
{
while(s[right]==1)
right++;
Min=min(mid,right-left);
mid=right-left;
Max=max(Max,Min);
left=right;
while(s[right]==2)
right++;
Min=min(mid,right-left);
mid=right-left;
left=right;
Max=max(Max,Min);
}
else
while(right<n)
{
while(s[right]==2)
right++;
Min=min(mid,right-left);
mid=right-left;
Max=max(Max,Min);
left=right;
while(s[right]==1)
right++;
Min=min(mid,right-left);
mid=right-left;
left=right;
Max=max(Max,Min);
}
cout<<2*Max<<endl;
}