zoukankan      html  css  js  c++  java
  • 1080 Graduate Admission (30分) 简单模拟+STL(erase操作超时)

    题目

    https://pintia.cn/problem-sets/994805342720868352/problems/994805387268571136

    题意

    模拟高校投档流程

    Sample Input:

    11 6 3
    2 1 2 2 2 3
    100 100 0 1 2
    60 60 2 3 5
    100 90 0 3 4
    90 100 1 2 0
    90 90 5 1 3
    80 90 1 0 2
    80 80 0 1 2
    80 80 0 1 2
    80 70 1 3 2
    70 80 1 2 3
    100 100 0 2 4

    Sample Output:

    0 10
    3
    5 6 7
    2 8

    1 4

    这题有一个点容易超时
    原因是对vector使用了erase操作~

    code

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int N,M,K;
    struct student{
        int id;
        int GE,GI;
        int x[6];
    }temp;
    vector<student>st;
    int sc[101];
    vector<int>ans[101];
    bool cmp(student a,student b)
    {
        if(a.GE+a.GI!=b.GE+b.GI) return a.GE+a.GI>b.GE+b.GI;
        else return a.GE>b.GE;
    }
    int main()
    {
        scanf("%d%d%d",&N,&M,&K);
        for(int i=0;i<M;++i) scanf("%d",sc+i);
        for(int i=0;i<N;++i)
        {
            scanf("%d%d",&temp.GE,&temp.GI);
            for(int j=0;j<K;++j) scanf("%d",&temp.x[j]);
            temp.id=i;
            st.push_back(temp);
        }
        sort(st.begin(),st.end(),cmp);
        int p=0;
        while(p<N)
        {
            for(int i=0;i<K;++i)
            {
                int y=st[p].x[i];//选学校y
                if(sc[y]>0)//y有名额
                {
                    ans[y].push_back(st[p].id);
                    sc[y]--;
                    int GE1=st[p].GE,GI1=st[p].GI;
                    ++p;
                    while(p<N)//排名相同也得进
                    {
                        if(GE1==st[p].GE && GI1==st[p].GI) {
                            ans[y].push_back(st[p].id);
                            sc[y]--;
                            ++p;
                        }
                        else break;
                    }
                    break;
                }
                else if(i==K-1){//落选
                    ++p;
                }
            }
        }
        for(int i=0;i<M;++i)
        {
            sort(ans[i].begin(),ans[i].end());
            for(int j=0;j<ans[i].size();++j)
            {
                printf("%d",ans[i][j]);
                if(j!=ans[i].size()-1) printf(" ");
            }
            printf("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    C#如何取硬件标志
    在C#中利用Excel做高级报表
    C#实现网段扫描
    用C#编写一个抓网页的应用程序
    C# 中操作API
    C#串口操作
    C#里的InputBox
    使用C#进行Word 2002和Excel 2002编程
    用C#快速往Excel写数据
    postgres 查看数据库大小
  • 原文地址:https://www.cnblogs.com/liuyongliu/p/13570912.html
Copyright © 2011-2022 走看看