题意:
蒜头君从现在开始工作,年薪 N 万。他希望在蒜厂附近买一套 60平米的房子,现在价格是 200 万。假设房子价格以每年百分之 K 增长,并且蒜头君未来年薪不变,且不吃不喝,不用交税,每年所得 N 万全都积攒起来,问第几年能够买下这套房子?(第一年年薪 N 万,房价 200 万)
输入格式
一行,包含两个正整数N(10≤N≤50),K(1≤K≤20),中间用单个空格隔开。
输出格式
如果在第 20 年或者之前就能买下这套房子,则输出一个整数 M,表示最早需要在第 M 年能买下;否则输出"Impossible"。
解题思路:
从第一年开始,计算每一年拥有的钱s和当前房子价格p并进行比较,如果钱够买房子,就输出答案;否则进入下一年。若到第20年还没能买下房子,则输出Impossible。注意工资和房价用float类型表示。
#include<iostream>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
float p=200;
float s=n;
int year=1;
while(s<p)
{
if(year>20)
{
cout<<"Impossible"<<endl;
break;
}
s+=n;
p=p*(1.0+k/100.0);
year++;
}
if(year<=20)
cout<<year<<endl;
return 0;
}
题意:
蒜头君的班级里有 n^2 个同学,现在全班同学已经排列成一个 n∗n 的方阵,但是老师却临时给出了一组新的列队方案
为了方便列队,所以老师只关注这个方阵中同学的性别,不看具体的人是谁
这里我们用 0 表示男生,用 1 表示女生
现在蒜头君告诉你同学们已经排好的方阵是什么样的,再告诉你老师希望的方阵是什么样的
他想知道同学们已经列好的方阵能否通过顺时针旋转变成老师希望的方阵
1.不需要旋转则输出 0
2.顺时针旋转 90° 则输出 1
3.顺时针旋转 180° 则输出 2
4.顺时针旋转 270° 则输出 3
若不满足以上四种情况则输出 -1
若满足多种情况,则输出较小的数字
输入格式
第一行为一个整数 n
接下来的 n 行同学们已经列好的 01 方阵;
再接下来的 n 行表示老师希望的的 01 方阵。
输出格式
输出仅有一行,该行只有一个整数,如题所示。
数据范围
对于 100% 的数据中, 1≤n≤20
解题思路:
a数组表示开始的矩阵,ans数组表示最后旋转得到的矩阵。用xuan()函数来执行一次顺时针旋转90°的操作。所以每执行一次xuan函数,就调用一次panduan函数,分别表示顺时针旋转0,90,180,270.如果都不满足,则输出-1.
#include<iostream>
using namespace std;
int n;
int a[25][25],ans[25][25];
void xuan()
{
int b[25][25];
int k=0;
for(int i=0;i<n;i++)
{
for(int 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 panduan()
{
int sum=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j]==ans[i][j])
sum++;
return sum==n*n?true:false;
}
int main()
{
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];
if(panduan())
{
cout<<"0"<<endl;
return 0;
}
xuan();
if(panduan()){
cout<<"1"<<endl;
return 0;}
xuan();
if(panduan()){
cout<<"2"<<endl;
return 0;}
xuan();
if(panduan()){
cout<<"3"<<endl;
return 0;}
else
{
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。
输出格式
输出一行,即密文对应的明文。
解题思路:
密文转换为明文,需要将每个字母向左移动五位。
s[i]=(s[i]-'A'-5+26)%26+'A'
读入的一串字母包含空格,所以用gets函数来读入。
#include<cstdio>
#include<cstring>
int main(){
char s[201];
gets(s); //接收密文
int i,len=strlen(s);
for(i=0;i<len;i++){
if(s[i]>='A'&&s[i]<='Z'){
s[i]=(s[i]-'A'-5+26)%26+'A'; //核心算法,向左平移5个
}
printf("%c",s[i]);
}
printf("\n");
return 0;
}
题意:
东东和他的女朋友(幻想的)去寿司店吃晚餐(在梦中),他发现了一个有趣的事情,这家餐厅提供的 n 个的寿司被连续的放置在桌子上 (有序),东东可以选择一段连续的寿司来吃
东东想吃鳗鱼,但是东妹想吃金枪鱼。核 平 起 见,他们想选择一段连续的寿司(这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种)我们用1代表鳗鱼,2代表金枪鱼。
比如,[2,2,2,1,1,1]这段序列是合法的,[1,2,1,2,1,2]是非法的。因为它不满足第二个要求。
东东希望你能帮助他找到最长的一段合法寿司,以便自己能吃饱。
解题思路:
用num1和num2来记录一串连续的1和2的个数,用is1和is2来表示当前索引之前的区间是全1还是全2。
若在区间1里又读到1,则num1++;否则读到了2,此时区间可能为12或212,要更新答案为之前的12相等个数,记录下1出现的次数和2出现的次数,然后取最小值和ans比,再取最大的ans。取最小值是因为1和2的个数必须一样,和ans取最大值是我们要找到最长的结果。然后清空开始的2的个数,让num2=1,并记录当前区间为2,即is2=1,is1=0。区间2同理。
#include <iostream>
#include<algorithm>
using namespace std;
int n;
int a[100050];
int ans=0;
int num1=0,num2=0;
bool is1=0,is2=0;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
if(a[0]==1) num1++,is1=1;
else if(a[0]==2) num2++,is2=1;
for(int i=1;i<n;i++)
{
if(a[i]==1)
{
if(is1) num1++;
if(is2)
{
ans=max(ans,min(num1,num2));
num1=1;
is1=1,is2=0;
}
}
else if(a[i]==2)
{
if(is2) num2++;
if(is1)
{
ans=max(ans,min(num1,num2));
num2=1;
is1=0,is2=1;
}
}
}
ans=max(ans,min(num1,num2));
cout<<2*ans<<endl;
return 0;
}