列表

详情


NC231684. 2021年CCPC中国大学生程序设计竞赛名额分配

描述

题目所叙述规则对真实规进行了一定程度上的改动。

2021年ccpc区域赛分配规则如下

一.2020年总决赛获奖队伍名额

关于获金、银、铜奖队伍具体数量的计算方法

令有效参赛队伍数为 A 支,则:

获金奖队伍数为:J = (A*10%)结果上取整;

获银奖队伍数为:Y = (A*30%)结果上取整 – J;

获铜奖队伍数为:T = (A*60%)结果上取整 – Y - J;

有效参赛队伍定义为至少提交通过 1 个题目的正式参赛队伍,非正式参赛队伍为打星队伍,其标志为队伍名最后一个字符为 *。

排名细则

所有正式参赛的参赛队按照解题数多少进行排名,解题数多的排名在前;若 解题数相同,再比较总用时,总用时少的排名在前。

总决赛获奖队伍奖励名额分配:

1. 金奖的学校 名额+4
2. 银奖的学校 名额+3
3. 铜奖的学校 名额+2
4. 优胜奖的学校 名额+1

每个学校只取最高奖项。

二. 全国网络预选赛名额分配

参加全国网络预选赛,各校的有效队伍最多为8支,各校前min{8,12-奖励名额}队伍,无论是否过题,均为有效队伍,所有参赛队伍均为正式队伍。

第一轮分配分配:

根据网络预选赛排名,进行首轮分配,排名前100的学校获得名额分为:

- A类 1-10 名额 +4
- B类 11-30 名额 +3
- C类 31-60 名额 +2
- D类 61-100 名额 +1

学校排名,取每个学校排名最高的队伍进行排名,所得到的即为学校排名。
第二轮名额分配

根据网络预选赛排名,第二轮分配名额为指定队伍排名,具体方案为A类校内排名第5、6的有效队伍,B类校内排名第4、5的有效队伍,C类校内排名第3、4的有效队伍, D类校内排名第2、3的有效队伍,其他学校校内排名第1、2的有效队伍,一同重新进行排名,前180的队伍,各获得1个名额。

第三轮名额分配

在前两轮中,未获得名额的学校,按学校排名取前40,各获得一个名额。

给出2020年总决赛获奖队伍排名以及全国网络预选赛队伍排名,请求出各个学校各获得多少名额。

输入描述

第一行两个整数 。表示2020年总决赛获奖队伍数量,全国网络预选赛队伍数量

下面 n 行,每行包含两个字符串 ,两个整数

下面 m 行,每行包含两个字符串,两个整数

保证 school,team 中只出现小写英文字母以及 * 。保证 time 各不相同。

输出描述

输出所有已知学校(2021年总决赛拥有有效队伍的学校以及全国预选赛的所有学校) ,各自获得的名额数量,以 school 字典序从小到大的顺序输出,每行形如 学校名: 所获名额数量,每个学校各占一行。

示例1

输入:

10 5
nanjingdaxue chuochuorangchuochuobie 9 1148
qinghuadaxue sangedinglia 11 1340
beijingdaxue nishizi 10 780
qinghuadaxue  miaomiaomiaomiaomiaomiaomiao 10 1126
xianjiaotongdaxue chabuduodele 10 1211
nanjingyoudiandaxue Cirtrus 10 1361
zhejiangdaxue SolitaryDream 8 788
tengxun tengxundaibiaodui* 8 842
kuangshi kuangshidaibiaodui* 8 1251
changchunligongdaxue dlrowollehstup 3 324
qinghuadaxue chongqizhengtu 12 1036
qinghuadaxue heihei 12 1230
qinghuadaxue sangedingxiang 12 2030
beijingdaxue chongshengcaigou 11 1523
beijingligongdaxue ddlzhanshen 10 1623

输出:

beijingdaxue: 7
beijingligongdaxue: 4
changchunligongdaxue: 1
nanjingdaxue: 1
nanjingyoudiandaxue: 2
qinghuadaxue: 8
xianjiaotongdaxue: 2
zhejiangdaxue: 1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 80ms, 内存消耗: 14208K, 提交时间: 2021-12-19 16:16:28

#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i)
#define fi first
#define se second
#define pb emplace_back
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()
using ll=long long;
using pa=pair<int,int>;
template<class A,class B>inline bool upmx(A&x,const B&y){return x<y?x=y,1:0;}
template<class A,class B>inline bool upmn(A&x,const B&y){return x>y?x=y,1:0;}
const int mo=998244353;
constexpr int Pow(int a,int b,int p=mo){int r=1;for(;b;b>>=1,a=1ll*a*a%p)if(b&1)r=1ll*r*a%p;return r;}
constexpr int reduce(int x){return x+(x>>31&mo);}
constexpr int& inc(int &x,int y){return x=reduce(x+y-mo);}
constexpr int& dec(int &x,int y){return x=reduce(x-y);}
#ifdef flukehn
void debug_out(){cerr<<endl;}
template <typename Head,typename... Tail>
void debug_out(Head H,Tail... T){
  cerr<<" "<<H;//to_string(H);
  debug_out(T...);
}
#define dbg(...) cerr<<"L"<<__LINE__<<" ["<<#__VA_ARGS__<<"]:",debug_out(__VA_ARGS__)
#define debug(...) cerr<<__VA_ARGS__//fprintf(stderr, __VA_ARGS__)
#else
#define dbg(...) 0
#define debug(...) 0
#endif

struct T{
  string s,t;
  int u,v;
  bool operator<(const T&b)const{
    if(u!=b.u)return u>b.u;
    return v<b.v;
  }
};
istream& operator>>(istream &in,T &a){
  in>>a.s>>a.t>>a.u>>a.v;
  return in;
}

map<string,int> f;

T a[10111],b[10111];
int n,m;
int main(){
#ifdef flukehn
  freopen("a.in","r",stdin);
#endif
  ios::sync_with_stdio(0),cin.tie(0);
  cin>>n>>m;
  For(i,0,n)cin>>a[i];
  For(i,0,m)cin>>b[i];
  sort(a,a+n);
  sort(b,b+m);
  vector<string> w;
 
  //w.resize(unique(ALL(w))-w.begin());
  
  w.clear();
  set<string> S;
  int p=0;
  map<string,vector<T> >g;
  map<string,int> cl;
  For(i,0,m){
    if(!g.count(b[i].s)){
      if(p<10){
        cl[b[i].s]=1;
        f[b[i].s]+=4;
      }else if(p<30){
        cl[b[i].s]=2;
        f[b[i].s]+=3;
      }else if(p<60){
        cl[b[i].s]=3;
        f[b[i].s]+=2;
      }else if(p<100){
        cl[b[i].s]=4;
        f[b[i].s]+=1;
      }
      ++p;
    }
    g[b[i].s].pb(b[i]);
  }
  vector<T> q;
  for(auto [s, t]:g){
    int c=cl[s];
    if(c==1) {
      if(SZ(t)>=5) q.pb(t[4]);
      if(SZ(t)>=6) q.pb(t[5]);
    }else if(c==2){
      if(SZ(t)>=4) q.pb(t[3]);
      if(SZ(t)>=5) q.pb(t[4]);
    }else if(c==3){
      if(SZ(t)>=3) q.pb(t[2]);
      if(SZ(t)>=4) q.pb(t[3]);
    }else if(c==4){
      if(SZ(t)>=2) q.pb(t[1]);
      if(SZ(t)>=3) q.pb(t[2]);
    }else{
      if(SZ(t)>=1) q.pb(t[0]);
      if(SZ(t)>=2) q.pb(t[1]);
    }
  }
  sort(ALL(q));
  For(i,0,min(180,SZ(q))) f[q[i].s]++;
  q.clear();
  for(auto [s,t]:g){
    if(!f.count(s)) q.pb(t[0]);
  }
  sort(ALL(q));
  For(i,0,min(40,SZ(q))) f[q[i].s]++;
  For(i,0,m) if(!f.count(b[i].s)) f[b[i].s]=0;

  //for(auto [s,t]:f)cout<<s<<": "<<t<<"\n";
  //dbg("----");

  w.clear();
  For(i,0,n)if(a[i].t.back()!='*'&&a[i].u)w.pb(a[i].s);
  int A=SZ(w);
  int J=(A*10+99)/100,Y=(A*30+99)/100,T=(A*60+99)/100;
  S.clear();
  For(i,0,SZ(w)){
    if(S.count(w[i]))continue;
    S.insert(w[i]);
    f[w[i]]+=1+(i<J)+(i<Y)+(i<T);
  }

  for(auto [s,t]:f)cout<<s<<": "<<t<<"\n";
}

上一题