A - 必做题11-1
思路
从第一年开始循环计算当年总收入与当年的房价,直到年数超过20年或者总收入大于房价停止循环。
循环结束后,若年数小于20,说明在20年内某一年总收入大于房价,则输出年数即可,若年数大于20,则说明20年内每一年房价都比总收入大,则输出“Impossible”。
代码
#include <iostream>
using namespace std;
int n, k,sum;
double rate, price;
bool flag;
int main()
{
scanf("%d %d", &n, &k);
rate = (float) k / 100;
sum = n;
price = 200;
flag = false;
for (int i = 1; i <= 20; i++)
{
if (sum >= price)
{
flag = true;
cout << i << endl;
break;
}
price *= (1 + rate);
sum += n;
}
if (flag != true)
cout << "Impossible" << endl;
return 0;
}
B - 必做题11-2
题目
蒜头君的班级里有 n2个同学,现在全班同学已经排列成一个 n∗n的方阵,但是老师却临时给出了一组新的列队方案
为了方便列队,所以老师只关注这个方阵中同学的性别,不看具体的人是谁
这里我们用 0表示男生,用 1表示女生
现在蒜头君告诉你同学们已经排好的方阵是什么样的,再告诉你老师希望的方阵是什么样的
他想知道同学们已经列好的方阵能否通过顺时针旋转变成老师希望的方阵
不需要旋转则输出 0
顺时针旋转 90° 则输出 1
顺时针旋转 180° 则输出 2
顺时针旋转 270° 则输出 3
若不满足以上四种情况则输出 −1
若满足多种情况,则输出较小的数字
输入格式
第一行为一个整数 n
接下来的 n行同学们已经列好的 01方阵;
再接下来的 n行表示老师希望的的 01方阵。
输出格式
输出仅有一行,该行只有一个整数,如题所示。
数据范围
对于 100%的数据中,1≤n≤20
Sample Input
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
Sample Output
1
思路
首先将输入保存到两个数组之中,接下来就是如何旋转数组。
对数组进行90°,180°,270°旋转后的结果,可看成是更改一下数组每个数的下标,因此我们可以直接改变数组的遍历方式,以到达与旋转相同的效果,如旋转90°,即将n列反向后变成第n行,因此改成从第一列的最后一个向上遍历,从第一列向后遍历即可。依据这种思想,我们可直接使用原始数组,对要旋转的数组采用不同的遍历方式来与目标数组(目标数组采用普通的遍历方式即可)比较即可判断旋转后是否匹配。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int quar[21][21], res[21][21];
int n;
void solve()
{
int b[21][21];
int k = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
b[i][j] = quar[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++)
quar[i][j] = b[i][j];
}
bool judge()
{
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (quar[i][j] == res[i][j])
ans++;
return ans == n * n ? true : false;
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &quar[i][j]);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &res[i][j]);
if (judge())
{
cout << "0" << endl;
return 0;
}
solve();
if (judge())
{
cout << "1" << endl;
return 0;
}
solve();
if (judge())
{
cout << "2" << endl;
return 0;
}
solve();
if (judge())
{
cout << "3" << endl;
return 0;
}
else
{
cout << "-1" << endl;
return 0;
}
}
C - 必做题11-3
思路
首先将密文读入到string中,遍历每一个字符,若其为大写字母则需转换为明文,这里密文转明文是一种类似环状结构中向前移5的操作,若该字符在F之后,则直接减5即可,若其在F之前,则同样需向前减5,不过小于A的时候需转到Z来操作。
代码
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int main()
{
string s;
getline(cin, s, '\n');
for (int i = 0; i < s.size(); i++)
{
if (s[i] - 'A' >= 0 && s[i] - 'A' < 26)
{
int t1 = s[i] - 'A';
if(t1<5)
t1=21+t1;
else
t1 -= 5;
char output='A'+t1;
cout << output;
}
else
cout << s[i];
}
return 0;
}
D - 必做题11-4
题目
东东和他的女朋友(幻想的)去寿司店吃晚餐(在梦中),他发现了一个有趣的事情,这家餐厅提供的 n 个的寿司被连续的放置在桌子上 (有序),东东可以选择一段连续的寿司来吃
东东想吃鳗鱼,但是东妹想吃金枪鱼。核 平 起 见,他们想选择一段连续的寿司(这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种)我们用1代表鳗鱼,2代表金枪鱼。
比如,[2,2,2,1,1,1]这段序列是合法的,[1,2,1,2,1,2]是非法的。因为它不满足第二个要求。
东东希望你能帮助他找到最长的一段合法寿司,以便自己能吃饱。
Input
输入:
第一行:一个整数n(2≤n≤100000),寿司序列的长度。
第二行:n个整数(每个整数不是1就是2,意义如上所述)
Output
输出:一个整数(代表东东可以选择的最长的一段连续的且合法的寿司)
Examples
Input
7
2 2 2 1 1 2 2
Output
4
Input
6
1 2 1 2 1 2
Output
2
Input
9
2 2 1 1 1 2 2 2 2
Output
6
思路
直接暴力处理,记录下1出现的次数和2出现的次数,然后取最小值的两倍和tempans比,再取其中较大的那个。取最小值是因为1和2的个数必须一样,和tempans取最大值是我们要找到最长的结果。下一次再找到1时,重置1出现的次数,等再一次碰到2,重置2出现的次数。
代码
#include <iostream>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int suxi[N];
int n, t1, t2;
int tempans;
int main()
{
scanf("%d", &n);
t1 = t2 = 1;
tempans = 0;
for (int i = 0; i < n; i++)
scanf("%d", &suxi[i]);
for (int i = 0; i < n-1; i++)
{
if (suxi[i] == suxi[i + 1])
t1++;
else
{
if (t2 >= t1)
tempans = max(tempans, 2 * t1);
else
tempans = max(tempans, 2 * t2);
t2 = 1;
for (int j = i + 1; j < n - 1; j++)
{
if (suxi[j] == suxi[j + 1])
t2++;
else
{
i=j;
break;
}
if(j==n-2)
i=j;
}
if (t2 >= t1)
tempans = max(tempans, 2 * t1);
else
tempans = max(tempans, 2 * t2);
t1 = 1;
}
}
if(t1!=1)
{
if (t2 >= t1)
tempans = max(tempans, 2 * t1);
else
tempans = max(tempans, 2 * t2);
}
cout << tempans << endl;
return 0;
}