zoukankan      html  css  js  c++  java
  • 安排考场,贪心

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=171

    解题报告:

    1、按照体重排序

    2、成绩过了分数线,就加入

    3、剩下没有安排的人,加入到各个区域,确保各个区域招满

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    const int maxZ=110;///最多有110个地区
    const int maxP=16000+10;///最多有16000+10个学生
    
    struct Zone{
        int index;///编号
        int level;///分数线
        int num;///人数
    }zone[maxZ];
    
    
    struct Student{
        int index;///编号
        int score;///分数
        int w;///体重
        int p;///是否存起来
    }stu[maxP];
    
    bool cmp1(Zone a,Zone b)
    {
        return a.level>b.level;
    }
    
    bool cmp2(Student a,Student b)
    {
        return a.w>b.w;
    }
    
    bool cmp3(Student a,Student b)
    {
        return a.index<b.index;
    }
    
    int main()
    {
        int n,k;
        while(scanf("%d",&k)!=EOF)
        {
            memset(stu,0,sizeof(stu));
    
            n=0;
            for(int i=1;i<=k;i++)
            {
                scanf("%d",&zone[i].num);
                zone[i].index=i;
                n+=zone[i].num;
            }
    
            for(int i=1;i<=k;i++)
            {
                scanf("%d",&zone[i].level);
            }
    
            sort(zone+1,zone+k+1,cmp1);
    
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&stu[i].score);
                stu[i].index=i;
            }
    
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&stu[i].w);
            }
    
            sort(stu+1,stu+n+1,cmp2);
    
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=k;j++)
                {
                    if(stu[i].score>zone[j].level&&zone[j].num>0)
                    {
                        stu[i].p=zone[j].index;
                        zone[j].num--;
                        break;
                    }
                }
            }
    
            int j = 1;
            for(int i=1;i<=n;i++) /// 按照体重由大到小随意分配剩下的学生,保证每个学生都有考试区域
            {
                if(stu[i].p!=0) continue;
                while(zone[j].num == 0) j++;
                stu[i].p = zone[j].index;
                zone[j].num--;
            }
    
            sort(stu+1,stu+n+1,cmp3);
    
            for(int i = 1; i <= n; i++)
            {
                if(i == 1) printf("%d", stu[i].p);
                else printf(" %d", stu[i].p);
            }
            printf("
    ");
    
        }
        return 0;
    }
  • 相关阅读:
    字典--------输出有序的格式
    输出数据和数据下标的两种方法
    删除操作
    搭建RabbitMQ环境(windows)
    SpringBoot 2.x 集成 Redis
    Redis 安装
    Spring Boot 数据库操作
    默认日志Logback配置
    通过poi下载图片到word
    Spring IoC 与 AOP
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5357356.html
Copyright © 2011-2022 走看看