题目一
题目描述
蒜头君从现在开始工作,年薪N万。他希望在蒜厂附近买一套60平米的房子,现在价格是 200万。假设房子价格以每年百分之K增长,并且蒜头君未来年薪不变,且不吃不喝,不用交税,每年所得N万全都积攒起来,问第几年能够买下这套房子?(第一年年薪N万,房价200万)
input
一行,包含两个正整数N(10≤N≤50),K(1≤K≤20),中间用单个空格隔开。
output
如果在第20年或者之前就能买下这套房子,则输出一个整数M,表示最早需要在第M年能买下;否则输出"Impossible"。
输出时每行末尾的多余空格,不影响答案正确性
example
input 1
50 10
output 1
8
做法与思路
很简单的考察循环的一道题。
循环判断工资总量和房价,总量大于房价则输出即可。
代码
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
float n,k;
cin>>n>>k;
k=k/100;
float sum=0;
float t=200;
for(int i=0;i<20;i++)
{
sum+=n;
if(sum>=t)
{
cout<<i+1;
return 0;
}
t=t*(1+k);
}
cout<<"Impossible";
return 0;
}
题目二
题目描述
蒜头君的班级里有 n^2 个同学,现在全班同学已经排列成一个n∗n 的方阵,但是老师却临时给出了一组新的列队方案
为了方便列队,所以老师只关注这个方阵中同学的性别,不看具体的人是谁
这里我们用0 表示男生,用1 表示女生
现在蒜头君告诉你同学们已经排好的方阵是什么样的,再告诉你老师希望的方阵是什么样的
他想知道同学们已经列好的方阵能否通过顺时针旋转变成老师希望的方阵
不需要旋转则输出 0
顺时针旋转 90° 则输出 1
顺时针旋转 180° 则输出 2
顺时针旋转 270° 则输出 3
若不满足以上四种情况则输出 −1
若满足多种情况,则输出较小的数字
input
第一行为一个整数 n
接下来的 n 行同学们已经列好的 01 方阵;
再接下来的 n 行表示老师希望的的 01 方阵。
output
输出仅有一行,该行只有一个整数,如题所示。
example
input 1
4
0 0 0 0
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 0
output 1
1
做法与思路
也是比较简单的一道题目。
首先要搞明白旋转90度会对矩阵造成怎样的变化,使用b记录当前矩阵的形态,设b旋转之后得到的矩阵为a,则a[j][n-i-1]=b[i][j].使用循环每次旋转90度后将得到的矩阵与目标矩阵对比,一致则输出。
代码
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int a[20][20];
int b[20][20];
int t[20][20];
int n;
bool check()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]!=t[i][j]) return 0;
}
}
return 1;//符合条件
}
void trans()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
a[j][n-i-1]=b[i][j];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
b[i][j]=a[i][j];
}
}
int main(int argc, char** argv) {
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
b[i][j]=a[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cin>>t[i][j];
}
for(int i=0;i<=3;i++)
{
bool judge=check();
if(judge)
{
cout<<i;
return 0;
}
trans();
}
cout<<-1;
return 0;
}
题目三
题目描述
Julius Caesar 曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后 55 位对应的字符来代替,这样就得到了密文。比如字符’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
你的任务是对给定的密文进行解密得到明文。
你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。
input
一行,给出密文,密文不为空,而且其中的字符数不超过200
output
输出一行,即密文对应的明文。
输出时每行末尾的多余空格,不影响答案正确性
example
input 1
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
output 1
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
做法与思路
更为简单的一道题,使用map数组建立原文字与密码的对应关系即可。
代码
#include <iostream>
#include <map>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//密文\text{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}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
//明文\text{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}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
map<char,char> t;
int main(int argc, char** argv) {
// t['A']='V'; t['B']='W'; t['C']='X'; t['D']='Y'; T['E']='Z';
for(int i=0;i<26;i++)
{
if(i<=20)
t['A'+i+5]='A'+i;
else
{
int tt=i-21;
t['A'+tt]='A'+i;
}
}
string ori;
getline(cin,ori);
for(int i=0;i<ori.length();i++)
{
if(t.find(ori[i])!=t.end())
{
ori[i]=t[ori[i]];
}
}
cout<<ori;
return 0;
}
题目四
题目描述
东东和他的女朋友(幻想的)去寿司店吃晚餐(在梦中),他发现了一个有趣的事情,这家餐厅提供的 n 个的寿司被连续的放置在桌子上 (有序),东东可以选择一段连续的寿司来吃
东东想吃鳗鱼,但是东妹想吃金枪鱼。核 平 起 见,他们想选择一段连续的寿司(这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种)我们用1代表鳗鱼,2代表金枪鱼。
比如,[2,2,2,1,1,1]这段序列是合法的,[1,2,1,2,1,2]是非法的。因为它不满足第二个要求。
东东希望你能帮助他找到最长的一段合法寿司,以便自己能吃饱。
input
输入:
第一行:一个整数n(2≤n≤100000),寿司序列的长度。
第二行:n个整数(每个整数不是1就是2,意义如上所述)
output
输出:一个整数(代表东东可以选择的最长的一段连续的且合法的寿司)
example
input 1
7
2 2 2 1 1 2 2
output 1
4
做法与思路
相较而言算是本周作业中比较需要思考的一道题。主要原因是时间复杂度需要限制到n。
要保证左侧一半全为一种(不妨设为1),右侧一半全为一种(不妨设为2),所以如果遇到了1,出现了111122221的情况,此时显然要把左侧的1111段舍弃,保留22221,即要维持“左侧为同一种,右侧为同一种”这个原则,然后在该原则上取min(左侧个数,右侧个数)即可。
本题关键思路还是要注意到“这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种”该句中包含的两个约束关系,并优先选取一个作为挑选区间的准则。
代码
#include <iostream>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int n;
int l=0,r=0;
int sum=0;
int n1=0,n2=0;
int a[100100];
int b[100100];
int ed=0;
int main(int argc, char** argv) {
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
if(a[0]==1) n1++;
else n2++;
ed=a[0];
for(int i=1;i<n;i++)
{
if(a[i]==1) n1++;
else n2++;
if(ed!=a[i])//新添加的与区间末尾不同
{
ed=a[i];
if(a[i]==1)
{
n1=1;
}
else n2=1;
}
int tsum=min(n1,n2);
sum=max(sum,tsum);
}
cout<<sum*2;
return 0;
}