1.裁纸刀
题解
通过分析可知,
边缘需裁剪4次,而后选择进行内部裁剪
内部裁剪有两种裁剪方式:
- 先行后列:
- 横向:【 行数-1 】次
- 纵向:【(列数-1)*行数】次
- 总:(行数-1)+(列数-1)*行数 = 行数 * 列数 - 1
- 先列后行:
- 纵向:【 列数-1 】次
- 横向:【(行数-1)*列数】次
- 总:(列数-1)+(行数-1)*列数 = 行数 * 列数 - 1
通过以上计算可知,对于 n 行 m 列的二维码,需要裁剪的次数为:4+n*m-1=n*m-3
题目共20行22列,则需裁剪 3+20*22 = 443 次
#include <iostream>
using namespace std;
int main()
{
cout<<"443"<<endl;
return 0;
}
2.灭鼠先锋
题解
#include <iostream>
using namespace std;
int main()
{
/*
* 对于只有一行的情况
* 如果只有1个位置,先手输
* 2个位置,后手输(先手1,后手1)
* 3个位置,后手输(先手2,后手1)
* 4个位置,共有以下几种情况(题目中第一行)
* XOOO: (剩余3个空位)先手输
* XXOO: (剩余2个空位)先手输
* OXOO: 先手输
* OXXO: 先手输
*
* 由上可知,先开始下第二行的人将输掉比赛
* 对于以下四种情况
* XOOO: 后手通过使棋局变成 XOXO 可保证自己赢得比赛
* XXOO: 后手赢
* OXOO: 后手赢(下一步:OXOX)
* OXXO: 先手赢
*/
cout << "LLLV" << endl;
return 0;
}
3.选数异或
题解
#include <iostream>
#include<map>
#include<cmath>
using namespace std;
int main()
{
int n, m, x;
cin>>n>>m>>x;
int Rightest[100005]; //在区间[1,i]中,使得[j,i]区间存在a^b=x的最大的j的取值
map<int, int> LastPosition; //某个值出现的最右的位置
for(int i = 1; i <=n; i++)
{
int a;
cin>>a;
Rightest[i] = max(Rightest[i-1],LastPosition[a^x]);
LastPosition[a] = i;
}
while(m--)
{
int