蓝桥杯DAY5-3.2

目录

 1.外卖店优先级

1.设置结构体的原因:

2.解释cmp

3.return a.time;<>

4.c++的sort()函数

2.矩形拼接


以下部分解释来自讯飞星火。


 1.外卖店优先级


代码出自罗老师的博客:倪文迪陪你学蓝桥杯2021寒假每日一题:1.29日(2019省赛A组第7题)_罗勇军 每日一题-CSDN博客

#include<bits/stdc++.h>
using namespace std;
const int N=100010;

int order[N];  //order[id]  第id号店上一次的订单
int prior[N];  //prior[id]  第id号店的优先级
int flag[N];   //flag[id]   第id号店在不在优先缓存中

struct node{
    int time,id;
}a[N];

bool cmp(node a, node b){
    if(a.id==b.id)
        return a.time<b.time;
    return a.id<b.id;
}

int main(){
    int m,n,T;  cin>>n>>m>>T;
    for(int i=0;i<m;i++)
        cin>>a[i].time>>a[i].id; //以下m行每行包含两个整数time和id,表示time时刻编号id的外卖店收到一个订单
    sort(a,a+m,cmp); //按时间排序
    for(int i=0;i<m;i++){
        int tt=a[i].time,  id=a[i].id;
        if(tt != order[id])  //如果当前订单时间不等于上一次的订单时间,则减去它们之间的间隔
            prior[id] -= tt-order[id]-1; //间隔需要再减1,比如2到5,间隔是3和4,就是2个
        prior[id] = prior[id] < 0 ? 0: prior[id];  //不小于0
        if(prior[id]<=3)  flag[id]=0;  //这一句和下面的+2不能换位置 //=0表示第id号店在不在优先缓存中
        prior[id]+=2;
        if(prior[id]> 5)  flag[id]=1; //=1表示在优先缓存中
        order[id]=tt;
    }
    for(int i=1;i<=n;i++)  //最后处理第T时刻
        if(order[i]<T){
            prior[i] -= T-order[i];
            if(prior[i]<=3)
                flag[i]=0;
        }

    int ans=0;
    for(int i=0;i<=n;i++)
        if(flag[i])
            ans++;
    cout<<ans;
    return 0;
}

1.设置结构体的原因:

struct node{
    int time,id;
}a[N];

在这段代码中,设置结构体`node`是为了存储每个订单的时间和店铺ID。

通过使用结构体,可以将时间和店铺ID封装为一个对象,方便进行排序和处理。

在排序函数`cmp`中,根据时间对订单进行排序,如果时间相同则按照店铺ID进行排序。这样可以确保订单按照时间顺序进行处理,并且可以方便地获取每个订单的时间和店铺ID

2.解释cmp

bool cmp(node a, node b){
    if(a.id==b.id)
        return a.time<b.time;
    return a.id<b.id;
}

这段代码定义了一个比较函数`cmp`,用于对结构体`node`进行排序。该函数接受两个参数`a`和`b`,分别表示两个订单对象。

在函数内部,首先判断两个订单的店铺ID是否相等,如果相等则比较它们的时间。如果时间不同,则返回时间较小的订单排在前面;如果时间相同,则返回店铺ID较小的订单排在前面。

这个比较函数的作用是按照店铺ID和时间的顺序对订单进行排序,确保订单按照时间顺序进行处理。

3.return a.time<b.time;

return a.time<b.time;

`return a.time<b.time;` 是一段代码,表示比较两个对象 `a` 和 `b` 的 `time` 属性的大小。如果 `a.time` 小于 `b.time`,则返回 `true`;否则返回 `false`。这通常用于排序比较操作中,以确定对象的顺序。

4.c++的sort()函数

`sort()`函数在C++中的一般形式是:
sort(start, end, cmp);

这个函数用于对指定范围内的元素进行排序。其中:

- `start` 表示要排序数组的起始地址,对于数组来说就是数组的首地址。
- `end` 表示数组结束地址的下一位。
- `cmp` 是可选参数,用于规定排序的方法,如果不填写,则默认为升序排序。

此外,如果需要对元素进行自定义排序,可以通过传递一个比较函数`cmp`来实现。这个比较函数应该接受两个参数并返回一个布尔值,以指示排序的顺序。

总的来说,`sort()`函数是一个非常强大且灵活的工具,它可以根据不同的需求对数据进行排序,从而提高程序的效率和可读性。


2.矩形拼接

7.矩形拼接 - 蓝桥云课 (lanqiao.cn)

尝试不同的放置方法,找规律,发现有三种情况:8条边,6条边,4条边。

注意,图中的a既可以指长,也可以指宽。b同理。

下面这个代码出自罗老师的博客(下面这个链接),我写了一些详细的注释,方便理解。

<蓝桥杯软件赛>零基础备赛20周--第5周--杂题-2-CSDN博客

#include<bits/stdc++.h>
using namespace std;
int a[3][2]; //行是3,代表三个矩形;列是2,用于存储矩形的长和宽
int main() {
	int T;
	cin >> T; //T代表数据组数,每组都是有三个矩形。题目问的是每组能拼出的多边形的边数的最小值
	while(T--)    {
		for(int i = 0; i < 3; i++) //每组有三个矩形
			cin >> a[i][0] >> a[i][1]; //输入一个矩形的长和宽
		int ans = 8; //三个矩形完全不能匹配,边数是8
		for(int i = 0; i < 3; i++)             //第1个矩形 为什么是0-3呢,意思是第一个矩形可以是这三个矩形中的任意一个,后面同理
			for(int j = 0; j < 3; j++)		   //第2个矩形
				if(i != j)              //因为i和j等一会的位置都是二维数组的第一个,所以i!=j保证了他俩不是同一个矩形
					for(int k = 0; k < 3; k++)   //第3个矩形
						if(k != i && k != j)     //同样的道理,保证三个矩形都不是同一个矩形
							for(int ii = 0; ii <= 1; ii++) {          //第1个有横竖两种摆法
								for(int jj = 0; jj <= 1; jj++) {      //第2个横竖摆
									for(int kk = 0; kk <= 1; kk++) {  //第3个横竖摆
										if(a[i][ii] == a[j][jj] + a[k][kk]) {
											ans = min(ans, 6);
											if(a[j][1-jj] == a[k][1-kk]) //如果第一条边符合上面的时候,第二条边还相等,那么也是四边形
												ans = min(ans, 4);
										}
										if(a[i][ii] == a[j][jj] || a[j][jj] == a[k][kk]) //第一个矩形的某条边=第二个矩形的某条边
											ans = min(ans, 6); //这种情况是6条边或者更少,也就是4条边
										if(a[i][ii] == a[j][jj] && a[j][jj] == a[k][kk]) //三个矩形有条边都相等,一定是4条边
											ans = min(ans, 4); //所以这里直接ans=4也可以
									}
								}
							}
		cout<<ans<<endl;
	}
	return 0;
}

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值