2022ccpc(天梯赛L1)

18 篇文章 0 订阅
8 篇文章 1 订阅

目录(L1)

1:今天我一定要赢

2:种钻石

3:谁能进图书馆

4:拯救外星人

5:试试手气

6:斯德哥尔摩火车上的题

7:机工士姆斯塔迪奥

8:静静的推荐


1:今天我一定要赢

题目链接:4464. 今天我要赢 - AcWing题库

 很简单的一道题目,属于基础送分题目,直接输出即可;

#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:谁能进图书馆

题目链接:4466. 谁能进图书馆 - AcWing题库

纵观全部题目,这是一道非常恶心的模拟题,恶心在他的每一种情况都需要特判,极少的分支能够融合,赛场上我这里就是想要融合几个分支,结果根本融合不了,造成了极大的困扰,最终导致这道题目没有拿满分,字符输出也要小心,少个空格错个数字也会导致赛场错误,一定注意;

其实我们经过一步一步分析,这道题的逻辑是并不困难的;

首先最简单的两种情况,俩人都进不去和俩人都能进去的情况,这种情况咱们可以直接判断,注意这里是下雨最低年龄,并不等于;

接下来是一个人能进去一个人进不去,这又要分开查看;

当某个人不能带另一个人进去,我们直接特判两种情况,一人年龄小于最低年龄,另一人不能携带,再细分谁不能进谁能进即可;

最后是某个人牵着另一个人可以进去的情况,最后这个要比上一个的判断简单。

代码如下:

#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:拯救外星人

题目链接:4467. 拯救外星人 - AcWing题库

 看懂了题目就很简单,就是给你两个数字相加之后计算这个结果的阶乘即可;

#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:试试手气

题目链接:4468. 试试手气 - AcWing题库

 这道题完全可以暴力模拟,但是其实有更简单的办法,我们发现我们只要最后一次的结果,我们不需要模拟每一次的情况,所以我们可以直接判断,每次只取最大的结果,那么肯定就是从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:静静的推荐

题目链接:4471. 静静的推荐 - AcWing题库

赛场上做到这道题目的时候我首先是很懵,然后思路也不行,究其原因就是赛场上真的很难想,不过我还是写了代码,过倒是过了,但是分没拿满;

这里我后来想到了更好的办法,赛场上我的想法是把所有人信息存起来,一个一个循环判断,但是赛后(现在)在仔细思考过后,我发现其实和顺序没关系,我们推荐的方式是一个分段每次推荐一个人,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;
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值