问题标题: 洛谷:P4160生日

0
0
朱英昊
朱英昊
中级守护
中级守护

为什么错了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)


0
孔德怡
孔德怡
新手光能
新手光能

不是,难道是我好久没登录过了嘛,我记得洛谷是有答案的呀,而且还有解说

0
0
张恩泽
张恩泽
高级天翼
高级天翼

这题不太难,但是要注意,你没有存每个数输入的先后顺序,所以在结构体里要定义一个a[i].xb;然后再写一个排下标的函数

0
丁勇智
丁勇智
中级守护
中级守护

我又来了!

首先,题目标签是:

字符串 &排序 &模拟 &选择排序

然而我们不用玄学的选择排序,我们来引进一种更加简(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;
}
0
0
0
0
0
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;
}

0
0
0
0
0
我要回答