蓝桥杯
今天不是打蓝桥杯吗,我打完后才发现比赛须知里说在比赛前会跳出一个“分享”的窗口,但是我没跳!!
还有最后忘点“提交该子卷”了,不会算没提交0分吧……(350分,我总分好像是277,因为最后的出栈方法数没写AC,只有27分……)
(其实我并没有把比赛须知读完,后悔了q_q)
编程6道题,但只记得后3:
T4
前言
大概就是矩阵旋转,不过要分层,example:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
变成↓
13 9 5 1
14 7 11 2
15 6 10 3
16 12 8 4
题目中说是分层,其实就是由外到内每一圈都换个方向转
例如$n = 4$的矩阵旋转方向be like:
─ ─ ─ ┐
↑ ┌ ─ │
│ └ ↑ │
└ ─ ─ ┘
最外圈顺时针,第二圈逆时针,以此类推。
其实和矩阵旋转差不多
输入格式
第$1$行一个整数$n$,表示矩阵的行数及列数
第$2$到$n + 1$行,每行$n$个整数,表示矩阵当前行的$n$个整数
输出格式
输出共$n$行
第$i$行输出旋转后矩阵的第$i$行的$n$个整数
样例数据
input
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
output
13 9 5 1
14 7 11 2
15 6 10 3
16 12 8 4
数据范围
$1$ <= $n$ <= $100$
我的程序:(回忆)
这题我AC了
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int a[n][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++)
{
int greater = max(i, n- i - 1), lesser = min(i, n - i - 1);
bool flag = (j >= lesser ? j <= greater ? lesser : n - j - 1 : j) & 1 ^ 1;
cout << (a[flag ? n - j - 1 : j][flag ? i : n - i - 1]) << ' ';
}
cout << '\n';
}
return 0;
}
T5
前言
最优策略
说Jerry和Tom (为什么是猫和老鼠???)
在玩卡牌,两人 (动物) 都很聪明,想让自己赢
每人 (动物) 都轮流在n个盒子里拿至少1张牌,哪个人 (动物) 当前摸的盒子里没有牌(拿不上牌)了,哪个人 (动物) 就输了
如果任何人 (动物) 在第n个盒子里拿了牌,则下一个人 (动物) 就需要在第1个盒子里拿(就是循环拿)
第一次由Jerry先拿,接下来两人轮流拿
现在问你,哪个人 (动物) 会赢?
数据很大,还多组,所以只能O(n)(输入)
可以分两种情况:
① n为奇数
这时Jerry必赢,因为第二次循环时Tom在上一次Jerry拿过的盒子拿,只要Jerry把第一个盒子里的牌拿完,Tom必输
② n为偶数
这时Jerry和Tom都可能赢,每个人 (动物) 在循环中都会在自己上一次循环拿过的盒子里拿牌,最好的方法当然是每次只拿一张牌
那此时问题就变为了谁的牌最少的盒子里的牌比另一个人 (动物) 的牌最少的盒子里的牌少,谁就输了……
吗?
如果每个人 (动物) 的牌最少的盒子里的牌数正好相同呢?
那么谁的牌最少的盒子靠前,谁就输了
总结起来就是此时谁的牌最少的盒子里的牌少或者两人 (动物) 牌最少的盒子里的牌数相等时,谁的牌最少的盒子靠前,谁就输了
反过来,那另一个人 (动物) 就赢了
输入格式
第$1$行一个整数$t$,表示有$t$组测试数据
接下来依次输入$t$组测试样例
每组测试样例共$2$行
第$1$行输入一个整数$n$,表示有$n$个盒子
第$2$行输入$n$个整数,第$i$个数表示第$i$个盒子里的牌数
输出格式
输出共$t$行
第$i$行为一个字符串"Jerry"或"Tom",表示第$i$组测试样例中赢的人的名字
样例数据
input
2
1
1
2
30 50
output
Jerry
Tom
我的程序
也AC了
#include <iostream>
using namespace std;
int main()
{
int t;
cin >> t;
while(t-- > 0)
{
int n;
cin >> n;
int minj = 1e9 + 1, mint = 1e9 + 1, tminj, tmint;
for(int i = 0; i < n; i++)
{
int a;
cin >> a;
if(i & 1 && a < mint)
{
mint = a;
tmint = i;
}
else if(a < minj)
{
minj = a;
tminj = i;
}
}
cout << (n & 1 || mint < minj || mint == minj && tmint < tminj ? "Jerry\n" : "Tom\n");
}
return 0;
}
T6
不想写了,下次再说awa