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;
}
}