目录(L1)
1:今天我一定要赢
很简单的一道题目,属于基础送分题目,直接输出即可;
#include<iostream>
using namespace std;
int main()
{
cout<<"I'm gonna win! Today!"<<endl;
cout<<"2022-04-23"<<endl;
}
2:种钻石
题目链接:4465. 种钻石 - AcWing题库
这道也是很简单的一道题目,但是做的时候会很疑惑,当某一天做完钻石还有剩余时间时这算不算一天,题目的样例给了我们答案,不算,所以这道题目直接整除即可
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
cout<<n/m<<endl;
}
3:谁能进图书馆
纵观全部题目,这是一道非常恶心的模拟题,恶心在他的每一种情况都需要特判,极少的分支能够融合,赛场上我这里就是想要融合几个分支,结果根本融合不了,造成了极大的困扰,最终导致这道题目没有拿满分,字符输出也要小心,少个空格错个数字也会导致赛场错误,一定注意;
其实我们经过一步一步分析,这道题的逻辑是并不困难的;
首先最简单的两种情况,俩人都进不去和俩人都能进去的情况,这种情况咱们可以直接判断,注意这里是下雨最低年龄,并不等于;
接下来是一个人能进去一个人进不去,这又要分开查看;
当某个人不能带另一个人进去,我们直接特判两种情况,一人年龄小于最低年龄,另一人不能携带,再细分谁不能进谁能进即可;
最后是某个人牵着另一个人可以进去的情况,最后这个要比上一个的判断简单。
代码如下:
#include<iostream>
using namespace std;
int main()
{
int n,m,a,b;
cin>>n>>m>>a>>b;
if(a>=n&&b>=n) //两个人都能进入的情况
{
cout<<a<<"-Y "<<b<<"-Y"<<endl;
cout<<"huan ying ru guan";
}
else if(a<n&&b<n)//两个人都进不去的情况
{
cout<<a<<"-N "<<b<<"-N"<<endl;
cout<<"zhang da zai lai ba";
}
else if(a<n&&b>=n&&b<m||a>=n&&a<m&&b<n)//特判,一人能进去一人进不去;
{
if(a>b)//前者能进去的情况
{
cout<<a<<"-Y "<<b<<"-N"<<endl;
cout<<"1: huan ying ru guan";
}
else //后者能进去的情况(这里是不会出现年龄相等的情况的)
{
cout<<a<<"-N "<<b<<"-Y"<<endl;
cout<<"2: huan ying ru guan";
}
}
else if(a<n&&b>=m||b<n&&a>=m)//最后特判能带着进去的情况
{
cout<<a<<"-Y "<<b<<"-Y"<<endl;
if(a>b) cout<<"qing 1 zhao gu hao 2";
else cout<<"qing 2 zhao gu hao 1";
}
}
4:拯救外星人
看懂了题目就很简单,就是给你两个数字相加之后计算这个结果的阶乘即可;
#include<iostream>
using namespace std;
typedef long long LL;
int main()
{
int a,b;
cin>>a>>b;
a+=b;
LL ans=1;
for(int i=1;i<=a;i++)
ans*=i;
cout<<ans<<endl;
}
5:试试手气
这道题完全可以暴力模拟,但是其实有更简单的办法,我们发现我们只要最后一次的结果,我们不需要模拟每一次的情况,所以我们可以直接判断,每次只取最大的结果,那么肯定就是从6开始。
这样我们就从6递减k次,如果第一次摇出来的情况包含在这之间,那么我们可以把结果-1即可
代码如下:
#include<iostream>
using namespace std;
int arr[10];
int main()
{
for(int i=1;i<=6;i++) cin>>arr[i];
int n;
cin>>n;
for(int i=1;i<=6;i++)
{
if(arr[i]>6-n) cout<<6-n<<' ';//发现如果进行n轮之后,arr[i]会出现重复,这里实质上已经减1
else cout<<6-n+1<<' ';//否则就正常输出,注意我们这里是减过了1
//比如n=3投掷三次后为:6-5-4,但是我们直接减为6-3=3;实质上已经减一这里注意想清楚
}
}
6:斯德哥尔摩火车上的题
题目链接:4469. 斯德哥尔摩火车上的题 - AcWing题库
通过题目就可以看出来代码,你甚至可以直接抄上去,代码的意思是,如果字符串当前位置的字符ASCII码值%2与他的前一个%2之后结果是否相同,相同就记录下来。
之后两个字符串进行判断即可;
这里可以使用string字符串的性质,直接进行加法;
代码如下:
#include<iostream>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
string an,bn;
for(int i=1;i<a.size();i++)
if (a[i] % 2 == a[i-1] % 2)
an += max(a[i], a[i-1]);//第一个字符串结果
for(int i=1;i<b.size();i++)
if (b[i] % 2 == b[i-1] % 2)
bn += max(b[i], b[i-1]);//第二个字符串结果
if(an==bn) cout<<an;//简单判断即可
else
{
cout<<an<<endl;
cout<<bn<<endl;
}
}
7:机工士姆斯塔迪奥
题目链接:4470. 机工士姆斯塔迪奥 - AcWing题库
这道题很惊奇啊,他是直接涂满一整行和一整列啊,我们这里可以用分割的思想,只要分割某一行之后,其他行的格子长度是不受影响的,所以涂满某一行后,其他格子可以用除了这一行的其他行计算,反之列也是如此,这里我们因为不知道输入的行和列是否存在重复。所以我们要不然开两个数组记录,要不然使用其他容器统计都可;
答案用行减去被涂满的行乘以列减去被涂满的列即可(不明白的同学可以去画个图看看)
#include<iostream>
using namespace std;
int an[100010],bn[100010];
int main()
{
int n,m,q;
cin>>n>>m>>q;
while(q--)
{
int a,b;
cin>>a>>b;
if(a==0) an[b]=1;
else bn[b]=1;//这里使用数组记录被涂满的行和列
}
int c=0,d=0;
for(int i=1;i<=n;i++)
if(an[i]==0)
c++;
for(int i=1;i<=m;i++)
if(bn[i]==0)
d++;
cout<<c*d<<endl;//统计没被涂的行与列直接相乘即可
}
8:静静的推荐
赛场上做到这道题目的时候我首先是很懵,然后思路也不行,究其原因就是赛场上真的很难想,不过我还是写了代码,过倒是过了,但是分没拿满;
这里我后来想到了更好的办法,赛场上我的想法是把所有人信息存起来,一个一个循环判断,但是赛后(现在)在仔细思考过后,我发现其实和顺序没关系,我们推荐的方式是一个分段每次推荐一个人,pat超90分的第一波推荐就直接走了,而且他也没有具体问我们每一波到底推荐了几个人,所以这里我们可以直接简化;
第一次把所有分数在175以上,pat超过录取线的人全部推荐走,接下来再进行每一次的推荐,这里的每一次推荐因为是每个分数段推荐的,所以只要某个分数的人数少于推荐次数,那么所有人一定会被推荐走,否则的话我们只需要推荐够人数即可;
我的写法是循环n遍,每一次只要还有人没被推荐就推荐,其实也可以一步判断到位,但是估计是数据强度不够,这里直接暴力循环判断也可以过掉;
代码如下:
#include<iostream>
using namespace std;
int arr[300];
int main()
{
int n,m,k;
cin>>n>>m>>k;
int ans=0;
while(n--)
{
int a,b;
cin>>a>>b;
if(b>=k&&a>=175) ans++;//ans是分数大于175,pat大于规定分数的人,他们第一波肯定会走,这里可以直接加上
else arr[a]++;
}
while(m--)//循环m次推荐
{
for(int i=175;i<=290;i++)
{
if(arr[i]>0) //只要这个分数段还有人就推荐上去;
{
ans++;
arr[i]--;//记得把人数减一
}
}
}
cout<<ans<<endl;
}