练习-14

3601. 成绩排序

有 NN 个学生的数据,将学生数据按成绩从低到高排序,如果成绩相同则按姓名字符的字典序排序,如果姓名的字典序也相同则按照学生的年龄从小到大排序,并输出 NN 个学生排序后的信息。

输入格式

第一行有一个整数 NN。

接下来的 NN 行包括 NN 个学生的数据。每个学生的数据包括姓名(长度不超过 100100 的字符串)、年龄(小于等于 100100 的正数)、成绩(小于等于 100100 的正数)。

输出格式

将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。

然后输出学生信息,按照如下格式:

姓名 年龄 成绩

学生姓名的字母序区分字母的大小写,如 AA 要比 aa 的字母序靠前(因为 AA 的 ASCII 码比 aa 的 ASCII 码要小)。

数据范围

1≤N≤10001≤N≤1000

输入样例:

3
abc 20 99
bcd 19 97
bed 20 97

输出样例:

bcd 19 97
bed 20 97
abc 20 99

代码:

#include<bits/stdc++.h>
using namespace std;
struct stu
{
    string name;
    int age;
    int g;
}stus[1001];
bool cmp(stu q,stu w)
{
    if(q.g>w.g)
    return 0;
    if(q.g<w.g)
    return 1;
    if(q.name==w.name)
        return q.age<w.age;
    return q.name<w.name;
}
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i ++ )
    cin >> stus[i].name>>stus[i].age>>stus[i].g;
    sort(stus,stus+n,cmp);
    for (int i = 0; i < n; i ++ )
    cout << stus[i].name<<' '<<stus[i].age<<' '<<stus[i].g<<endl;
}

2074. 倒计数

艾弗里有一个由 NN 个正整数构成的数组。

数组中的第 ii 个整数是 AiAi。

如果一个连续的子数组的长度为 mm,并且按顺序包含整数 m,m−1,m−2,…,2,1m,m−1,m−2,…,2,1,则称它为 mm 倒计数。

例如,[3,2,1][3,2,1] 是 33 倒计数。

请帮助艾弗里计算她的数组中有多少个 KK 倒计数。

输入格式

第一行包含整数 TT,表示共有 TT 组测试数据。

对于每组数据,第一行包含两个整数 NN 和 KK。

第二行包含 NN 个整数,其中第 ii 个表示 AiAi。

输出格式

每组数据输出一个结果,每个结果占一行。

结果表示为 Case #x: y,其中 xx 为组别编号(从 11 开始),yy 为 KK 倒计数的数量。

数据范围

1≤T≤1001≤T≤100,
2≤K≤N2≤K≤N,
1≤Ai≤2×1051≤Ai≤2×105,
2≤N≤2×1052≤N≤2×105

输入样例:

3
12 3
1 2 3 7 9 3 2 1 8 3 2 1
4 2
101 100 99 98
9 6
100 7 6 5 4 3 2 1 100

输出样例:

Case #1: 2
Case #2: 0
Case #3: 1

样例解释

在示例 11 中,有两个 33 倒计数,如下:

  • 1 2 3 7 9 3 2 1 8 3 2 1
  • 1 2 3 7 9 3 2 1 8 3 2 1

在示例 22 中,没有 22 倒计数。

在示例 33 中,有一个 66 倒计数,如下:

  • 100 7 6 5 4 3 2 1 100

 

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int a[N],b[N];
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    for (int c = 1; c <= t; c ++ )
    {
        int n;
        cin >> n;
        int k;
        cin >> k;
        for (int i = 0; i < n; i ++ )
        cin >> a[i];
        map<int,int>mp;
        for (int i = n-1; i >=0; i-- )
        {
            if(a[i]==1)
            {
                mp[1]++;
                while(i>=0&&a[i-1]-a[i]==1)
                {
                    mp[a[i-1]]++;
                    i--;
                }
            }
        }
        cout <<"Case #"<<c<<": "<< mp[k]<<endl;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值