目录
以下部分解释来自讯飞星火。
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.矩形拼接
尝试不同的放置方法,找规律,发现有三种情况:8条边,6条边,4条边。
注意,图中的a既可以指长,也可以指宽。b同理。
下面这个代码出自罗老师的博客(下面这个链接),我写了一些详细的注释,方便理解。
#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;
}