题目一
题意
蒜头君从现在开始工作,年薪 N万。他希望在蒜厂附近买一套 6060 平米的房子,现在价格是 200200 万。假设房子价格以每年百分之 K 增长,并且蒜头君未来年薪不变,且不吃不喝,不用交税,每年所得 N 万全都积攒起来,问第几年能够买下这套房子?(第一年年薪 N万,房价 200 万)
输入
一行,包含两个正整数 N(10≤N≤50),K(1≤K≤20),中间用单个空格隔开。
输出
如果在第 20 年或者之前就能买下这套房子,则输出一个整数 M,表示最早需要在第 M 年能买下;否则输出"Impossible"。
输出时每行末尾的多余空格,不影响答案正确性
思路
- 显然是数学计算题,n年后总钱数:sum=N(1+0.01k)^n
- 注意点20年后循环break
代码
#include<iostream>
using namespace std;
int main()
{
double n,k;cin>>n>>k;
double sum1=200;double sum2=n;
for(int i=1;;i++)
{
if(sum1<=sum2&&i<=20)
{
cout<<i<<endl;exit(0);
}if(i>20) break;
sum1=sum1*(1+0.01*k);
sum2=sum2+n;
}cout<<"Impossible"<<endl;
return 0;
}
题目二
题意
蒜头君的班级里有 n^2个同学,现在全班同学已经排列成一个 n * n 的方阵,但是老师却临时给出了一组新的列队方案
为了方便列队,所以老师只关注这个方阵中同学的性别,不看具体的人是谁
这里我们用 0 表示男生,用 1表示女生
现在蒜头君告诉你同学们已经排好的方阵是什么样的,再告诉你老师希望的方阵是什么样的
他想知道同学们已经列好的方阵能否通过顺时针旋转变成老师希望的方阵
不需要旋转则输出 0
顺时针旋转 90° 则输出 1
顺时针旋转 180° 则输出 2
顺时针旋转 270° 则输出 3
若不满足以上四种情况则输出 -1
若满足多种情况,则输出较小的数字
输入
第一行为一个整数 n
接下来的 n行同学们已经列好的 01方阵;
再接下来的 n 行表示老师希望的的 01方阵。
输出
输出仅有一行,该行只有一个整数,如题所示。
思路
- 该题就是将01矩阵输入到二维数组,进行矩阵的转置,判矩阵是否相同
- 只需要设计一个90°旋转的函数即可,多次调用完成180°、270°
代码
#include<iostream>
using namespace std;
bool a[30][30],b[30][30];int n;
bool same(bool c[30][30],bool d[30][30])
{ bool flag=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(c[i][j]!=d[i][j])
{
flag=1;break;
}
}if(flag==1) break;
} if(flag==1) return 0;
return 1;
}
bool turn(bool c[30][30])
{
bool d[30][30];
for(int k=n,i=1;k>=1,i<=n;k--,i++)
{
for(int j=1;j<=n;j++)
d[j][k]=c[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=d[i][j];
return 1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>b[i][j];
if(same(a,b))
{
cout<<0<<endl;return 0;
}
if(turn(a))
{
if(same(a,b))
{
cout<<1<<endl;return 0;
}
}
if(turn(a))
{
if(same(a,b))
{
cout<<2<<endl;return 0;
}
}
if(turn(a))
{
if(same(a,b))
{
cout<<3<<endl;return 0;
}
}
cout<<"-1"<<endl;return 0;
}
题目三
题意
Julius Caesar 曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后 5 位对应的字符来代替,这样就得到了密文。比如字符’A’用’F’来代替。如下是密文和明文中字符的对应关系。
密文A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
明文V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
你的任务是对给定的密文进行解密得到明文。
你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。
输入
输入格式
一行,给出密文,密文不为空,而且其中的字符数不超过 200。
输出
输出一行,即密文对应的明文。
输出时每行末尾的多余空格,不影响答案正确性
思路
- 该题就是对于字符串处理,再输入字符串str的同时对str[i]>=‘A’&&str[i]<='Z’的str[i]进行处理即根据题意
if(str[i]>=‘F’&&str[i]<=‘Z’)
str[i]=str[i]-5;
else str[i]=str[i]+21;
代码
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string str;getline(cin,str);
for(int i=0;i<str.size();i++)
{
if(str[i]>='A'&&str[i]<='Z')
{
if(str[i]>='F'&&str[i]<='Z')
str[i]=str[i]-5;
else str[i]=str[i]+21;
}cout<<str[i];
}cout<<endl;return 0;
}
题目四
题意
东东和他的女朋友(幻想的)去寿司店吃晚餐(在梦中),他发现了一个有趣的事情,这家餐厅提供的 n 个的寿司被连续的放置在桌子上 (有序),东东可以选择一段连续的寿司来吃
东东想吃鳗鱼,但是东妹想吃金枪鱼。核 平 起 见,他们想选择一段连续的寿司(这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种)我们用1代表鳗鱼,2代表金枪鱼。
比如,[2,2,2,1,1,1]这段序列是合法的,[1,2,1,2,1,2]是非法的。因为它不满足第二个要求。
东东希望你能帮助他找到最长的一段合法寿司,以便自己能吃饱。
输入
输入:
第一行:一个整数n(2≤n≤100000),寿司序列的长度。
第二行:n个整数(每个整数不是1就是2,意义如上所述)
输出
输出:一个整数(代表东东可以选择的最长的一段连续的且合法的寿司)
思路
- 该题我的初始想法是对于读入的数组a[i]进行类似尺取的思想,左端点l进行遍历,维护一个一段区间,用flag表示1和2之间的转换关系,num[1]和num[2]为1和2的个数,在遍历的时候如果该段区间既有1又有2则flag=1,这时分为a[r]!=a[r-1]和a[r]==a[r-1]操作,都要对num[1]和num[2]进行判断更新ans,flag=0时直接num[a[r]]++;判断更新ans,ans即为区间的最大值
- 简单的想法是边读取边操作,读入的过程记录s[1]和s[2],然后区间取min(s[1],s[2]),保证1和2次数相等,并且区间更新为每次区间的最大值,遇到a[i]!=a[i+1]的情况就记录转变次数flag,flag==3时,重置s[num]=0,flag–;
代码
/*简单做法
int main()
{
int n;cin>>n;int last=0,flag=0;
for(int i=1;i<=n;i++)
{
int num;cin>>num;
if(num!=last) flag++;
if(flag==3)
s[num]=0,flag--;
s[num]++;
ans=max(ans,min(s[1],s[2]));
last=num;
}
}*/
//下面的想复杂了
#include<iostream>
#include<cstring>
using namespace std;
int a[100010];
int main()
{ int n;cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int l=0;int r=1;int ans=0;bool flag=0;
int num[4];memset(num,0,sizeof(num));num[a[0]]++;
while(l<n&&r<=n)
{
while(l<=r&&r<n)
{ if(flag)
{
if(a[r]!=a[r-1])
{
if(num[1]==num[2])
ans=max(ans,r-l); break;
}
num[a[r]]++;
if(num[1]==num[2])
{
ans=max(ans,r-l+1);r++;break;
}
}
else
{
num[a[r]]++;
if(a[r]!=a[r-1])flag=1;
if(num[1]==num[2])
{
ans=max(ans,r-l+1);r++;break;
}
}
r++;
}
if(a[l]!=a[l+1]) flag=0;
num[a[l]]--;l++;
if(r==n&&num[1]==num[2]) ans=max(ans,r-l);
} cout<<ans<<endl;return 0;
}