注意的问题(外卖店优先级)

题目:拼数

for(int i = 0; i < n; i++)
cin >> a[i]; 注意:cin可以实现a[1]里放一个字符串这种。数组并不是a[1]里只能放一个数
注意cin输入时 空格不放入数组(字符串中)所以数据行输入时用cin
排序注意
bool cmp (string a, string b){ //从大到小字典序排序
return a + b > b + a; //注意体会这个技巧
}
sort(a, a + n, cmp); //从大到小字典序排序
sort 函数的写法sort(nums+1, nums+1+n); 详情见下方代码块
数组可以理解为:从num数组标号1到n
sort 注意 包括前面 不包括后面

#include<bits/stdc++.h>
using namespace std;
int nums[200010];
int main() {
    int n;    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
        scanf("%d",&nums[i]);
    sort(nums+1, nums+1+n);
    int cnt = 0;
    for(int i = 1; i <= n; i++) {
        cnt++;
        if(nums[i] != nums[i+1]) {
           printf("%d %d\n", nums[i], cnt);
           cnt = 0;
        }
    }
}

cmp函数的意思为比较a+b和b+a。选择较大的放前面,实现降序。!!!一定注意类型是字符串

#include<bits/stdc++.h>
using namespace std;
string a[21];  //记录20个数,用字符形式
bool cmp (string a, string b){   //从大到小字典序排序
    return a + b > b + a;        //注意体会这个技巧
}
int main( ){
    int n;    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    sort(a, a + n, cmp);    //从大到小字典序排序
    for(int i=0; i < n; i++)
        cout << a[i];
    return 0;
}

cmp函数写法2
用true的返回值来写

bool cmp(stu a,stu b){
    if(a.sum > b.sum)
        return true;
    else if(a.sum < b.sum)
        return false;
    else{      //a.sum == b.sum
        if(a.c > b.c)
            return true;
        else if(a.c < b.c)
            return false;
        else{   //a.c == b.c
            if(a.id > b.id)
                return false;
            else return true;
        }
    

结构体的写法

注意:结构体stu(同学) 与st(张三,李四等)
bool cmp(stu a,stu b) 注意!!!

#include<bits/stdc++.h>
using namespace std;
struct node{
    int id;      //学号
    int c,m,e;   //语、数、外
    int sum;
}st[305]; //直接写数组
bool cmp(node a,node b){//这里写的是Node
  

排序:例题:外卖店优先级

在这里插入图片描述
在这里插入图片描述
输入:每一行的数据为结构体变量a[n]的两个元素
代码注意排序部分
bool cmp(node a, node b){ //结构体排序
if(a.id==b.id)
return a.time<b.time;
return a.id<b.id;
}
id从小到大排,id相同的时间从小到大排

//改写自:https://www.jianshu.com/p/1e625af51a3a
#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;
    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;
        prior[id] = prior[id] < 0 ? 0: prior[id];  //不小于0
        if(prior[id]<=3)  flag[id]=0;
        prior[id]+=2;
        if(prior[id]> 5)  flag[id]=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;
}

bool的意思

bool就是布尔的意思,布尔值的返回值只有真(true)和假(false),多用于判断。

break循环的意思

当break语句用于do-while、for、while循环语句中时,可使程序终止循环。

输入数据时如果想要黑框不消失一直输

写出while(1)
当输入的数据不符合要求时 break

逻辑表达式?:

s[i]=1?1:0
意思是s[i]等于1吗,等于1的话整个表达式值为1,不等于1时整个表达式值为0。
用法实例:
s1[i+1]=(s1[i+1]=='*'?'o':'*');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值