中级守护
为什么错了T A T错在哪T A T代码如下:
// luogu-judger-enable-o2
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
struct brithday{
string name;
int year,month,day;
};
brithday a[100];
bool go(brithday a,brithday b){
return a.year<b.year;
}
bool run(brithday a,brithday b){
return a.month<b.month;
}
bool sun(brithday a,brithday b){
return a.day<b.day;
}
int main(){
int n;
cin>>n;
for(int i=0;i<=n-1;i++){
cin>>a[i].name;
scanf("%d%d%d",&a[i].year,&a[i].month,&a[i].day);
}
for(int i=0;i<=n-1;i++){
sort(a,a+n,go);
if(a[i].year==a[i+1].year){
sort(a+i,a+i+1,run);
if(a[i].month==a[i+1].month){
sort(a+i,a+i+1,sun);
}
}
}
for(int i=0;i<=n-1;i++){
cout<<a[i].name<<"\n";
}
return 0;
}
感谢!
朱英昊在2018-11-15 21:27:49追加了内容
前面的注释不要管
朱英昊在2018-11-16 12:08:36追加了内容
网址:https://www.luogu.org/recordnew/show/13819760
朱英昊在2018-11-16 12:10:21追加了内容
网址错了,正确网址:https://www.luogu.org/problemnew/show/P1104
朱英昊在2018-11-17 08:45:32追加了内容
题目描述
cjf
君想调查学校OI
组每个同学的生日,并按照从大到小的顺序排序。但cjf
君最近作业很多,没有时间,所以请你帮她排序。
输入输出格式
输入格式:
有22行,
第11行为OI
组总人数nn;
第22行至第n+1n+1行分别是每人的姓名ss、出生年yy、月mm、日dd。
输出格式:
有nn行,
即nn个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)
输入输出样例
输入样例#1: 复制
3 Yangchu 1992 4 23 Qiujingya 1993 10 13 Luowen 1991 8 1
输出样例#1: 复制
Luowen Yangchu Qiujingya
说明
数据规模
1<n<1001<n<100
length(s)<20length(s)<20
朱英昊在2018-11-17 08:47:31追加了内容
重复的只用管前面一个(nn就是指n)
中级守护
我又来了!
首先,题目标签是:
字符串 &排序 &模拟 &选择排序
然而我们不用玄学的选择排序,我们来引进一种更加简(xuan)单(xue)的排序方法:
快速排序!!!!
首先推荐一个网站:算法可视化
看到这里的人去该网站看快排的图示,肯定要比我讲的好的多…………
快排呢,用的是分治法。先找一个基准数,把比他小的放他左边,比他大的放他右边,再递归左边和右边。
好吧,我承认我讲不清楚,看图吧…………
6个数:5,7,6,4,3,8.
---
--- | |
| | --- | |
--- | | | | | |
| 5 | | | | | --- | 8 |
| | | 7 | | | | | --- | |
| 基| | | | 6 | | | | | | |
| 准| | | | | | 4 | | 3 | | |
| | | | | | | | | | | |
--- --- --- --- --- ---
把3和4移到5左边,剩下的在5右边。
---
--- | |
| | --- | |
--- | | | | | |
--- | 5 | | | | | | 8 |
| | --- |基 | | 7 | | | | |
| | | | |准 | | | | | | |
| 4 | | 3 | | | | | | 6 | | |
| | | | | | | | | | | |
--- --- --- --- --- ---
这样就确定了5的位置。
递归左边,3和4交换。
---
--- | |
| | --- | |
--- | | | | | |
--- | 5 | | | | | | 8 |
--- | | |基 | | 7 | | | | |
| | | | |准 | | | | | | |
| 3 | | 4 | | | | | | 6 | | |
| | | | | | | | | | | |
--- --- --- --- --- ---
这样,3,4,5的位置就确定了。
再递归右边
---
--- | |
--- | | | |
--- | | | | | |
--- | 5 | | | | | | 8 |
--- | | |基 | | 6 | | 7 | | |
| | | | |准 | | | | | | |
| 3 | | 4 | | | | | | | | |
| | | | | | | | | | | |
--- --- --- --- --- ---
排好了QWQ
回到本题:
#include<bits/stdc++.h>
using namespace std;
struct node//结构体排序
{
字符串 s;//名字
整形 n,y,r,num;//年,月,日,输入的编号。
}a[110];
int n;
布尔 cmp(node a,node b)
{
如果a.n<b.n)return 1;//先比年
if(a.n>b.n)return 0;
if(a.n==b.n)
{
if(a.y<b.y)return 1;//再比月
if(a.y>b.y)return 0;
if(a.y==b.y)
{
if(a.r<b.r)return 1;//再比日
if(a.r>b.r)return 0;
if(a.r==b.r)
{
if(a.num>b.num)return 1;//最后比编号
else return 0;
}
}
}
}
int main()
{
输入>>n;
循环(int i=1;i<=n;i++)cin>>a[i].s>>a[i].n>>a[i].y>>a[i].r,a[i].num=i;//输入
sort(a+1,a+n+1,cmp);//快排
循环(int i=1;i<=n;i++)输出a[i].s<<endl;//输出。
return 0;
}
高级天翼
inline int read() //读入优化
{
int x=0,f=1;
char c=getchar();
while (c<48||c>57)
f=c=='-'?-1:1,c=getchar();
while (c>=48&&c<=57)
x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int bool comp(const node &a,const node &b) //排序函数
{
if (a.y<b.y)
return 1;
if (a.y>b.y)
return 0;
if (a.m<b.m)
return 1;
if (a.m>b.m)
return 0;
if (a.d<b.d)
return 1;
if (a.d>b.d)
return 0;
return a.no>b.no; //最后判断同一天的情况
}
int main()
{
int i;
n=read();
for (i=1;i<=n;i++)
{
输入;
a[i].y=read();
a[i].m=read();
a[i].d=read();
a[i].no=i;
}
//sort排序
输出
return 0;
}