2020大一寒假ACM培训①(结构体+排序篇)

结构体:

在储存处理大量不同类型的数据时,数组一般很难直接实现,此时就可以用结构体来解决问题。

语法知识:

struct 结构体

 struct tag {//struct为结构体关键字, tag为结构体的标志
 member-list//member-list为结构体成员列表
 } variable-list ; //variable-list为此结构体声明的变量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也可将变量声明写在主函数内

#include <stdio.h>
#include <string.h>

struct Books
{[
](https://blog.csdn.net/we1meng/article/details/70208708)
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
int main( )
{
   struct Books Book1;        /* 声明 Book1,类型为 Books */
   struct Books Book2;        /* 声明 Book2,类型为 Books */

另一种定义方法: typedef struct 定义

类似于这种

typedef struct stu
{    int xuehao;
     int chengji;   
}stu;

具体用法以及两者区别请参见
C/C++语法知识:typedef struct 用法详解
结构体定义 typedef struct 用法详解和用法小结
struct和typedef struct彻底明白了

排序

1.sort 排序

在这里插入图片描述在这里插入图片描述

2.cmp 函数排序

举个例子

struct sa{
int  num;
double cj;
}a[200];

int cmp(const struct sa &a,const struct sa &b)
{
    return a.cj>b.cj;//按成绩从高到低排
}

练习:

NEFU OJ 1481 谁考了第k名-排序

#include <bits/stdc++.h>
#include<algorithm>
using namespace std;
struct sa{
int  num;
double cj;
}a[200];

int cmp(const struct sa &a,const struct sa &b)
{
    return a.cj>b.cj;
}

int main()
{
   int k,n;
   cin>>n>>k;
   for(int i=1;i<=n;i++)
    cin>>a[i].num>>a[i].cj;
   sort(a+1,a+1+n,cmp);
   printf("%d %g\n",a[k].num,a[k].cj);
   return 0;
}

NEFU OJ 1482 奇数单增序列

#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
int a[600],b[600];

int main()
{
    int n,i,j;
    cin>>n;
    for(i=1;i<=n;i++)
    cin>>a[i];
    j=1;
    for(i=1;i<=n;i++)
        if(a[i]%2!=0)
        {
        b[j]=a[i];
        j++;
        }
    sort(b+1,b+j);
    for(i=1;i<j;i++)
    {printf("%d",b[i]);
    if(i!=j-1)
        printf(",");}
    return 0;
}

NEFU OJ 1659 没必要的排序1

#include <bits/stdc++.h>
#include <algorithm>
using namespace std;

int a[2000];

int main()
{
    int n,k,s;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+1+n,greater<int>());
    s=0;
    for(int i=1;i<=k;i++)
        s=s+a[i];
    cout<<s;
    return 0;
}

NEFU OJ 1650 没必要的排序2

#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
const int maxn=1e7+10;
const int maxk=1e5+10;
int a[maxn];

int main()
{
    ios::sync_with_stdio(false);
    int n,k,x,ans,num;
    cin>>n>>k;
    memset(a,0,sizeof(a));
    for(int i=1;i<=n;i++)
        {cin>>x;
        a[x]++;}
    num=ans=0;
    for(int i=1e5;i>1;i--)
    {
        if(a[i]>0)
        {
            ans=ans+a[i]*i;
            num=num+a[i];
        }
        if(num>k)
        {
            ans=ans-(num-k)*i;
            break;
        }
    }
    cout<<ans;
    return 0;
}

NEFU OJ 554 老和尚的导员

这题写的有点麻烦了,可以直接定义数组,过程参见戏说三国。

#include <bits/stdc++.h>
using namespace std;
struct sa{
    int c;
    int xd;
    int gs;
    int e;
    int sum;
    int xh;
} a[200];
bool cmp(const struct sa &a,const struct sa &b)
{
    {
    if(a.sum!=b.sum)
        return a.sum>b.sum;
    else if(a.c!=b.c)
        return a.c>b.c;
    else if(a.xd!=b.xd)
        return a.xd>b.xd;
    else if(a.gs!=b.gs)
        return a.gs>b.gs;
    else if(a.e!=b.e)
        return a.e>b.e;
}

}
int main()
{
    int n,i;
    while(scanf("%d",&n)!=-1)
    {
        memset(a,0,sizeof(a));
    for(i=1; i<=n; i++)
    {
        a[i].xh=i;
        cin>>a[i].c>>a[i].xd>>a[i].gs>>a[i].e;
        a[i].sum=a[i].c+a[i].xd+a[i].gs+a[i].e;
    }
    sort(a+1,a+n+1,cmp);
    for(i=1; i<=n; i++)
        printf("%d %d\n",a[i].xh,a[i].sum);
    }
    return 0;
}

NEFU OJ 556 健忘的老和尚

#include <bits/stdc++.h>
#include <string.h>
using namespace std;
struct sa{
char name[200];
int f;
};

int cmp(sa a,sa b)
{
    return a.f<b.f;
}
int main()
{
    sa a[200];
    int n,i,m,o;
    while(cin>>n>>m>>o)
    {
    memset(a,0,sizeof(a));
    for(i=1;i<=n;i++)
    cin>>a[i].name>>a[i].f;
    sort(a+1,a+1+n,cmp);
    for(i=n-m+1;i<=n;i++)
        printf("%s\n",a[i].name);
    for(i=1;i<=o;i++)
        printf("%s\n",a[i].name);
    }
    return 0;
}

NEFU OJ 873 戏说三国

在这里插入图片描述
这是一个神坑的点!

#include <bits/stdc++.h>
using namespace std;
struct sa{
 char name[30];
 int  b[5];
 double  c[5];
 double s;
} a[1100];
bool cmp(const struct sa &m,const struct sa &n)
{
    if(m.s!=n.s)
        return m.s>n.s;
    else if(m.b[1]!=n.b[1])
        return m.b[1]>n.b[1];
    else if(m.b[2]!=n.b[2])
        return m.b[2]>n.b[2];
    else if(m.b[3]!=n.c[3])
        return m.b[3]>n.b[3];
}
int main()
{
    int n,i,k,x;
    double d,z,t;
    cin>>n;
    for(k=1;k<=n;k++)
    {
    memset(a,0,sizeof(a));
    scanf("%d %lf %lf %lf",&x,&d,&z,&t);
    for(i=1; i<=x; i++)
    {
        cin>>a[i].name>>a[i].b[1]>>a[i].b[2]>>a[i].b[3];
        a[i].c[1]=(a[i].b[1]*z)/100;
        a[i].c[2]=(a[i].b[2]*d)/100;
        a[i].c[3]=(a[i].b[3]*t)/100;
        a[i].s=a[i].c[1]+a[i].c[2]+a[i].c[3];
    }
    sort(a+1,a+1+x,cmp);
    printf("Case #%d:\n",k);
     for(i=1; i<=x; i++)
        printf("%s %.4lf %.4lf %.4lf %.4lf\n",a[i].name,a[i].s,a[i].c[1],a[i].c[2],a[i].c[3]);
    }
    return 0;
}

NEFU OJ 1147 谁不及格?

这个题的输出格式一点要看清!是一堆名字,一堆学号,一堆成绩输出的,不是按一个人一个人输出的。

#include <bits/stdc++.h>
#include <string.h>
using namespace std;
struct sa
{
    char name[30];
    char xh[20];
    double cj;
}a[20];
int main()
{
    int n,i,j,k,b[20];
    while(scanf("%d",&n)!=-1)
    {
        j=1;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(i=1; i<=n; i++)
        {
            scanf(" %[^\n] %s %lf",a[i].name,a[i].xh,&a[i].cj);
        if(a[i].cj<60)
        {
            b[j]=i;
            j++;
        }}
        if(j==1)
            {printf("They are Great!!");
            printf("\n");
            continue;}
        if(j>1)
        {
            printf("%d\n",j-1);
            for(k=1; k<j; k++)
                printf("%s\n",a[b[k]].name);
            for(k=1; k<j; k++)
                {printf("%s\n",a[b[k]].xh);}
            for(k=1; k<j; k++)
                printf("%.2lf\n",a[b[k]].cj);
        }
    }
   return 0;
}

NEFU OJ 1637 身高问题

#include <bits/stdc++.h>
using namespace std;
struct sa
{
    char name[20];
    int h;
    long int xh;
} a[200];
bool cmp(const struct sa &m,const struct sa &n)
{
    if(m.h!=n.h)
        return m.h>n.h;
    else return m.xh<n.xh;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1; i<n; i++)
        scanf("%s%d%ld",a[i].name,&a[i].h,&a[i].xh);
    sort(a+1,a+1+n,cmp);
    printf("%s %d %ld",a[1].name,a[1].h,a[1].xh);
    return 0;
}

NEFU OJ 1483 成绩排序

#include <bits/stdc++.h>

using namespace std;
struct sa
{
    char  name[20];
    int cj;
} a[200];

int cmp(const struct sa &a,const struct sa &b)
{
    if(a.cj!=b.cj)
        return a.cj>b.cj;
    else
        return strcmp(a.name,b.name)<0;
}

int main()
{
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
        cin>>a[i].name>>a[i].cj;
    sort(a+1,a+1+n,cmp);
    for(int i=1; i<=n; i++)
        printf("%s %d\n",a[i].name,a[i].cj);
    return 0;
}

NEFU OJ 1683 成绩统计

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n,p,s,q,i;
    char x,a[10];
    while(cin>>n)
    {
        p=s=0;
        for(i=1;i<=n;i++)
        {
            cin>>x;
           if(x=='C')
           {cin>>a; p++;}
           if(x=='N')
           {
            cin>>q;
            s+=q;
           }
    }
    printf("%d %d\n",p,s/(n-p));
    }
    return 0;
}

NEFU OJ 874 相约摩洛哥

#include <bits/stdc++.h>

using namespace std;

struct sa
{
    char name[20];
    int p[5],t[5];
    int sum;
    int gs;
} a[100001];

int cmp(const struct sa &m,const struct sa &n)
{
    if(m.gs!=n.gs)
        return m.gs>n.gs;
    else
        return m.sum<n.sum;
}

int main()
{
    int n,i;
    while(cin>>n)
    {
        memset(a,0,sizeof(a));
        for(i=1; i<=n; i++)
        {
            cin>>a[i].name>>a[i].p[1]>>a[i].p[2]>>a[i].p[3];
            if(a[i].p[1]!=-1)
                a[i].gs++;
            if(a[i].p[2]!=-1)
                a[i].gs++;
            if(a[i].p[3]!=-1)
                a[i].gs++;
        }
        for(i=1; i<=n; i++)
        {
            cin>>a[i].t[1]>>a[i].t[2]>>a[i].t[3];
            if(a[i].p[1]!=-1)
            {
                if(a[i].t[1]==1)
                    a[i].sum+=a[i].p[1];
                else
                    a[i].sum+=a[i].p[1]+20*(a[i].t[1]-1);
            }
            if(a[i].p[2]!=-1)
            {
                if(a[i].t[2]==1)
                    a[i].sum+=a[i].p[2];
                else
                    a[i].sum+=a[i].p[2]+20*(a[i].t[2]-1);
            }
            if(a[i].p[3]!=-1)
            {
                if(a[i].t[3]==1)
                    a[i].sum+=a[i].p[3];
                else
                    a[i].sum+=a[i].p[3]+20*(a[i].t[3]-1);
            }
        }
        sort(a+1,a+1+n,cmp);
        for(i=1; i<=n; i++)
            printf("%s %d %d\n",a[i].name,a[i].gs,a[i].sum);
    }
    return 0;
}

NEFU OJ 1297 结构体排序题一

思想:分类讨论

#include <bits/stdc++.h>
using namespace std;
struct sa
{
    int x,y;
} a[110];
bool cmp0x0y(const struct sa &m,const struct sa &n)
{
    if(m.x!=n.x)
        return m.x>n.x;
    else if(m.y!=n.y)
        return m.y>n.y;
}
bool cmp0x1y(const struct sa &m,const struct sa &n)
{
    if(m.x!=n.x)
        return m.x>n.x;
    else if(m.y!=n.y)
        return m.y<n.y;
}
bool cmp1x0y(const struct sa &m,const struct sa &n)
{
    if(m.x!=n.x)
        return m.x<n.x;
    else if(m.y!=n.y)
        return m.y>n.y;
}
bool cmp1x1y(const struct sa &m,const struct sa &n)
{
    if(m.x!=n.x)
        return m.x<n.x;
    else if(m.y!=n.y)
        return m.y<n.y;
}
int main()
{
    int p,q,n;
    while(cin>>p>>q>>n)
    {
        for(int i=1; i<=n; i++)
            cin>>a[i].x>>a[i].y;
        if(p==0&&q==0)
            sort(a+1,a+1+n,cmp0x0y);
        if(p==0&&q==1)
            sort(a+1,a+1+n,cmp0x1y);
        if(p==1&&q==0)
            sort(a+1,a+1+n,cmp1x0y);
        if(p==1&&q==1)
            sort(a+1,a+1+n,cmp1x1y);
        for(int i=1; i<=n; i++)
            printf("(%d,%d)\n",a[i].x,a[i].y);
    }
    return 0;
}

NEFU OJ 1186 优秀学生

#include <iostream>
#include <cstdio>

using namespace std;
struct student
{
    char name[20],num[8];
    int c;
};
int main()
{

    int x,i,k;
    student stu[100];
    while(scanf("%d",&x)!=-1)
    {
        for(i=0; i<x; i++)
        {
            scanf("%s %s %d",stu[i].num,stu[i].name,&stu[i].c);
        }
        k=0;
        for(i=0; i<x; i++)
        {
            if(stu[i].c>=90)
            {
                printf("%s %s %d\n",stu[i].num,stu[i].name,stu[i].c);
                k++;
            }
        }
        printf("%d\n",k);
    }
    return 0;
}

NEFU OJ 1053 cc-test9-01结构体应用

#include <iostream>
#include <cstdio>

using namespace std;
struct student
{
    char name[20],numb[8];
    double num;
};
int main()
{
    int x,i;
    while(scanf("%d",&x)!=-1)
    {
        student stu[100];
        for(i=0; i<x; i++)
            scanf("%s %[^\n] %lf",stu[i].numb,stu[i].name,&stu[i].num);
        for(i=0; i<x; i++)
        {
            printf("%s  %s  %.2lf",stu[i].numb,stu[i].name,stu[i].num);
            printf("\n");
        }
    }
    return 0;
}

acm虐我千百遍,我待acm如初恋。

被毁坏的玉米地 ACM程序设计培训教程 经典数据结构与算法……………………………………………………………1   1.1 线性表………………………………………………………………………………1   1.1.1 线性表的顺序存储结构……………………………………………………1   1.1.2 插入操作……………………………………………………………………2   1.1.3 删除操作……………………………………………………………………2   1.1.4 线性表的链式存储…………………………………………………………2   1.1.5 单链表………………………………………………………………………2   1.1.6 单链表的插入操作…………………………………………………………3   1.1.7 单链表的删除操作…………………………………………………………3   1.1.8 循环链表……………………………………………………………………4   1.1.9 双向链表……………………………………………………………………5   1.1.10 双向链表的插入操作………………………………………………………5   1.1.11 双向链表的删除操作………………………………………………………5   1.1.12 静态链表……………………………………………………………………5   1.2 栈………………………………………………………………………………………………5   1.2.1 顺序栈……………………………………一…………………………………6   1.2.2 链栈……………………………………………………………………………………………………9   l.3 队列…………………………………………………………………………………………10   1.3.1 链队列………………………………………………………………………10   1.3.2 循环队列……………………………………………………………………12   1.4 串的定义……………………………………………………………………………13   1.5 抽象数据类型串的实现……………………………………………………………14   1.5.1 定长顺序串…………………………………………………………………14   1.5.2 堆串………………………………………………………………………………18   1.5.3 块链串………………………………………………………………………24   1.6 查找的基本概念……………………………………………………………………24   1.6.1 顺序查找法…………………………………………………………………25   1.6.2 折半查找法…………………………………………………………………26   1.6.3 分块查找法…………………………………………………………………27   1.6.4 基于树的查找法……………………………………………………………28   1.6.5 计算式查找法——哈希法…………………………………………………28   1.7 排序的基本概念……………………………………………………………………33   1.7.1 插入类排序…………………………………………………………………34   1.7.2 直接插入排序………………………………………………………………34   1.7.3 折半插入排序………………………………………………………………35   1.7.4 表插入排序…………………………………………………………………36   1.7.5 冒泡排序……………………………………………………………………39   1.7.6 快速排序……………………………………………………………………40   1.8 分配类排序…………………………………………………………………………41   1.8.1 多关键字排序………………………………………………………………42   1.8.2 链式基数排序………………………………………………………………42   1.8.3 基数排序的顺序表结构……………………………………………………45   1.8.4 各种排序方法的综合比较…………………………………………………46   第2章 蛮力法………………………………………………………………………47   2.1搜索所有的解空间…………………………………………………………………47   〖案例l〗假金币…………………………………………………………………47   〖案例2〗现在的时间是多少……………………………………………………49   2.2 搜索所有的路径……………………………………………………………………52   〖案例3〗矩阵……………………………………………………………………52   2.3 直接计算……………………………………………………………………………54   〖案例4〗数的长度………………………………………………………………54   2.4 模拟与仿真…………………………………………………………………………56   〖案例5〗冲撞的机器人…………………………………………………………56   第3章 贪心算法………………………………………………………………………61   3.1 构造法………………………………………………………………………………61   〖案例1〗订票……………………………………………………………………6I   3.2 反证法………………………………………………………………………………67   〖案例2〗电梯……………………………………………………………………68   3.3 调整法………………………………………………………………………………70   〖案例3〗水位……………………………………………………………………70   〖案例4〗埃及分数………………………………………………………………73   〖案例5〗数划分的研究…………………………………………………………74   第4章 背包问题………………………………………………………………………78   4.1 用贪心法解决背包问题……………………………………………………………78   〖案例1〗最佳装载………………………………………………………………78   4.2 回溯法解决背包问题………………………………………………………………81   〖案例2〗0/1背包…………………………………………………………………81   4.3 遗传算法解决背包问题……………………………………………………………86   〖案例3〗0/1背包……………………………………………………………86   4.4 动态规划解决背包问题……………………………………………………………94   〖案例4〗适配背包………………………………………………………………94   第5章回溯法………………………………………………………………………97   5.1 组合与数的问题……………………………………………………………………97   〖案例l〗组合问题………………………………………………………………97   〖案例2〗数的划分………………………………………………………………99   5.2 回溯法与搜索……………………………………………………………………101   〖案例3〗素数填表问题…………………………………………………………101   〖案例4〗八皇后问题……………………………………………………………105   第6章 动态规划……………………………………………………………………109   6.1 最优子结构………………………………………………………………………1 1 1   〖案例1〗拦截导弹………………………………………………………………1ll   6.2 应用动态规划的步骤……………………………………………………………113   〖案例2〗公共子序列……………………………………………………………113   〖案例3〗Uxuhul的表决…………………………………………………………115   第7章 DFS与BFS以及剪枝问题……………………………………………………119   7.1 深度优先遍历……………………………………………………………………119   〖案例l〗15数码难题……………………………………………………………120   〖案例2〗三角形大战……………………………………………………………121   7.2 宽度优先遍历……………………………………………………………………122   〖案例3〗蛇和梯子………………………………………………………………123   7.3 剪枝方法…………………………………………………………………………127   第8章 线性规划和整数规划…………………………………………………………129   8.1 简单线性规划……………………………………………………………………129   〖案例l〗炼金术…………………………………………………………………129   8.2 整数规划…………………………………………………………………………134   〖案例2〗装箱问题………………………………………………………………134   第9章 最小生成树…………………………………………………………………139   9.1 Prim算法…………………………………………………………………………………………………140   9.2 Kruskal算法………………………………………………………………………………………………143   9.3 Sollin算法…………………………………………………………………………………………………145   第10章 大数问题……………………………………………………………………146   10.1 大数的加减………………………………………………………………………146   〖案例1〗整数探究………………………………………………………………146   10.2 大数的乘积……………………………………………………………………148   〖案例2〗相连游戏………………………………………………………………148   〖案例3〗公牛的数学……………………………………………………………150   10.3 用FFT作大数乘法………………………………………………………………151   〖案例4〗X问题…………………………………………………………………152   10.4 任意精度计算……………………………………………………………………155   〖案例5〗幂……………………………………………………………………155   10.5 大数的除法………………………………………………………………………157   第11章 计算几何学…………………………………………………………………158   11.1 判断点是否在多边形中…………………………………………………………158   11.2 判断线段是否在多边形内………………………………………………………159   11.3 计算几何典型算法………………………………………………………………160   〖案例1〗计算周长问题…………………………………………………………161   〖案例2〗正方形问题……………………………………………………………162   〖案例3〗计算平面点集凸壳的算法……………………………………………163   第12章 着色问题与排队论……………………………………………………………167   12.1 着色问题…………………………………………………………………………168   12.1.1 顶点着色问题……………………………………………………………168   12.1.2 边着色问题………………………………………………………………177   12.2 排队论……………………………………………………………………………………………………179   第13章 组合数学……………………………………………………………………188   13.1 鸽巢原理…………………………………………………………………………188   13.2 容斥原理…………………………………………………………………………190   〖案例1〗棋盘覆盖问题…………………………………………………………192   〖案例2〗被毁坏的玉米地(Crop Circles)问题………………………………193   13.3 递推关系…………………………………………………………………………197   〖案例3〗Josephus问题…………………………………………………………197   〖案例4〗假币问题………………………………………………………………199   13.4 发生函数…………………………………………………………………………202   13.5 Polya定理………………………………………………………………………………………………204   第14章 概率论…………………………………………………………………………206   14.1 基本概念…………………………………………………………………………206   14.2 基本概率算法……………………………………………………………………208   〖案例1〗快速排序………………………………………………………………209   〖案例2〗八皇后问题……………………………………………………………210   14.3 蒙特卡罗(Monte Carlo)型概率算法…………………………………………214   第15章 凸包问题……………………………………………………………………217   15.1 穷举法解决凸包问题……………………………………………………………217   15.2 格雷厄姆扫描法解决凸包问题…………………………………………………218   15.3 分治法解决凸包问题……………………………………………………………220   15.4 蛮力法解决凸包问题……………………………………………………………222   15.5 Jarris步进法解决凸包问题………………………………………………………224   15.6 应用…………………………………………………………………………………………………………227   〖案例l〗果园篱笆………………………………………………………………227   〖案例2〗巨人和鬼………………………………………………………………232   第16章 数论问题……………………………………………………………………236   16.1 数的幂运算………………………………………………………………………236   〖案例l〗高级模运算……………………………………………………………236   16.2 欧拉定理的应用…………………………………………………………………238   〖案例2〗快乐2004……………………………………………………………239   〖案例3〗2x mod n=1……………………………………………………………240   16.3 素数测试…………………………………………………………………………243   〖案例4〗素数距离………………………………………………………………243   〖案例5〗素数测试………………………………………………………………246   16.4 Pell方程…………………………………………………………………………………………………250   〖案例6〗Smith问题……………………………………………………………250   附录A 排课时间表问题源代码………………………………………………………258   参考文献………………………………………………………………………………269
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值