A 必做题11-1
题目:
蒜头君从现在开始工作,年薪 NN 万。他希望在蒜厂附近买一套 6060 平米的房子,现在价格是 200200 万。假设房子价格以每年百分之 KK 增长,并且蒜头君未来年薪不变,且不吃不喝,不用交税,每年所得 NN 万全都积攒起来,问第几年能够买下这套房子?(第一年年薪 NN 万,房价 200200 万)
input:
一行,包含两个正整数 N(10 \le N \le 50)N(10≤N≤50),K(1 \le K \le 20)K(1≤K≤20),中间用单个空格隔开。
output:
如果在第 2020 年或者之前就能买下这套房子,则输出一个整数 MM,表示最早需要在第 MM 年能买下;否则输出"Impossible"。
输出时每行末尾的多余空格,不影响答案正确性
思路:
本题用一个循环来代表时间推移。每次循环中蒜头君多一份工资,房价增长一次。
跳出循环的条件有三种:工资总数大于当前房价、房子这一年的涨价已超过每年工资、年份超过20。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
using namespace std;
int main() {
int n; //年薪
int k; //年利率
cin >> n >> k;
bool flag;
double sum = 0;//年薪之和
int m = 0; //m年
double price = 200;//房价
for (int m = 1; m <= 20; m++) {
sum = sum + n;
if (sum >= price) {
cout << m;
flag=1;
return 0;
}
price = price * (1 + k / 100.0);
}
if(!flag)
cout << "Impossible";
}
B - 必做题11-2
题目:
蒜头君的班级里有 n^2个同学,现在全班同学已经排列成一个n∗n 的方阵,但是老师却临时给出了一组新的列队方案
为了方便列队,所以老师只关注这个方阵中同学的性别,不看具体的人是谁
这里我们用 0 表示男生,用 1 表示女生
现在蒜头君告诉你同学们已经排好的方阵是什么样的,再告诉你老师希望的方阵是什么样的
他想知道同学们已经列好的方阵能否通过顺时针旋转变成老师希望的方阵
不需要旋转则输出 0
顺时针旋转 90° 则输出 1
顺时针旋转 180° 则输出 2
顺时针旋转 270° 则输出 3
若不满足以上四种情况则输出 -1
若满足多种情况,则输出较小的数字
思路:
模拟,本题只要进行四次判断即可。每次将矩阵顺时针旋转90°,其中顺时针旋转180°可看作两次顺时针旋转90°,顺时针旋转270°可看作三次顺时针旋转90°。
旋转90°时,第1行变成第n列,第2行变成第n-1列,…,第n行变成第1列。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
int a[30][30],ans[30][30];
void solve(){
int b[30][30];
int k=0,i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
b[i][j]=a[n-1-k][i];
k++;
if(j==n-1)
k=0;
}
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=b[i][j];
}
bool judge(){
int anss=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j]==ans[i][j])
anss++;
return anss==n*n?true:false;
}
int check(){
for(int i=0;i<=3;i++)//顺时针翻转90,90*2,90*3
{
if(judge()){
cout<<i<<endl;
return 0;
}
solve();
}
if(!judge())
{
cout<<"-1"<<endl;
return 0;
}
}
int main(){
while(cin>>n){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>ans[i][j];
check();
}
return 0;
}
**
C - 必做题11-3
题意
Julius Caesar 曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后 5 位对应的字符来代替,这样就得到了密文。你的任务是对给定的密文进行解密得到明文。你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。
思路
对大写字母字符对应的ASCII码,利用5位位移和取余操作将密文解为明文即可。
利用字符数组接收输入,只对大写字母元素进行上述操作,最后输出。
debug:对ASCII码进行减法运算得到负数时,直接对其取余会得到乱码,因此利用模26将减5改为加21。
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <stdlib.h>
using namespace std;
string s;
int main()
{
getline(cin,s);
int len1=s.size();
for(int i=0;i<len1;i++)
{
if(s[i]=='A')
s[i]='V';
else if(s[i]=='B')
s[i]='W';
else if(s[i]=='C')
s[i]='X';
else if(s[i]=='D')
s[i]='Y';
else if(s[i]=='E')
s[i]='Z';
else if(s[i]=='\0')
s[i]='\0';
else if(s[i]<=90&&s[i]>=70)
s[i]=s[i]-5;
else
s[i]=s[i];
}
for(int i=0;i<len1;i++)
{
cout<<s[i];
}
cout<<endl;
}
D 必做题11-4
题目:
东东和他的女朋友(幻想的)去寿司店吃晚餐(在梦中),他发现了一个有趣的事情,这家餐厅提供的 n 个的寿司被连续的放置在桌子上 (有序),东东可以选择一段连续的寿司来吃
东东想吃鳗鱼,但是东妹想吃金枪鱼。核 平 起 见,他们想选择一段连续的寿司(这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种)我们用1代表鳗鱼,2代表金枪鱼。
比如,[2,2,2,1,1,1]这段序列是合法的,[1,2,1,2,1,2]是非法的。因为它不满足第二个要求。
东东希望你能帮助他找到最长的一段合法寿司,以便自己能吃饱。
思路:
这个题有一个点很关键,是所给的数列只有两个值1和2,所以我只需要分别记录每段连续的1的个数,连续的2的个数,且在记录的数组中一定是1的个数和2的个数连续出现,这样就解决了问题–>记录一段连续的1或2中的个数
至于寿司的数量,要在连续记录的两个数中(一个是1的个数,一个是2的个数)取较小值再乘以2,最后在所有得到的值中取最大值
代码:
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int b[3];
int n,ans;
int a[N], last=0;
int main(){
cin>>n;
for(int i=0; i<n;i++)
{
cin>>a[i];
}
for(int i=0; i<n;i++)
{
if(a[i]!=last)
{
last=a[i];
ans=max(ans,2*min(b[1],b[2]));
b[a[i]]=0;
}
b[a[i]]++;
}
ans=max(ans,2*min(b[1],b[2]));
cout<<ans<<endl;
return 0;
}