前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >牛客寒假算法基础集训营2 B. 处女座与cf(模拟)

牛客寒假算法基础集训营2 B. 处女座与cf(模拟)

作者头像
Ch_Zaqdt
发布2019-01-28 11:32:08
3380
发布2019-01-28 11:32:08
举报
文章被收录于专栏:Zaqdt_ACMZaqdt_ACMZaqdt_ACM

题目链接:https://ac.nowcoder.com/acm/contest/327/B

       大模拟...按题目要求来就好了,因为题目中说了一道题的提交的最后一次是AC的话这道题才算过,所以我们可以倒着去推,如果这道题的最后一次提交结果是AC就去找前面除了CE的提交有几次,然后计算得分就好了,如果最后一次提交的结果不是AC,那么这道题就不会得分(正着也可以写)。还有就是输出的时候,要求相等分数的名次相同,所以对于得分为4 3 2 2 1的排名是1 2 3 3 5,而不是1 2 3 3 4,就是因为这一点,比赛的时候疯狂wa....


AC代码:

#include <bits/stdc++.h>
using namespace std;
struct Node{
    string str;
    bool flag;
    int sum;
}Edge[505];
struct node{
  int t;
  string s,num,sta;
}a[10005];
int n,m;
typedef pair<string,string> p;
map<p,int> ma;
int A = 150, B = 300, C = 450, D = 600, E = 750;
int _A = 2, _B = 4, _C = 6, _D = 8, _E = 10;
 
bool cmp(Node a,Node b){
    return a.sum > b.sum;
}
 
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        cin>>Edge[i].str;
        Edge[i].sum = 0;
        Edge[i].flag = false;
    }
  for(int i=1;i<=m;i++){
    scanf("%d",&a[i].t);
    cin>>a[i].s>>a[i].num>>a[i].sta;
  }
  int cnt = 0;
  for(int i=m;i>=1;i--){
    if(ma[p(a[i].s,a[i].num)] == 0){
      if(a[i].sta == "CE" || a[i].sta == "WA" || a[i].sta == "TLE"){
        for(int j=1;j<=n;j++){
          if(Edge[j].str == a[i].s){
            if(Edge[j].flag == false) cnt ++;
            Edge[j].flag = true;
          }
        }
      }
      if(a[i].sta == "AC"){
        int xx = 0;
        for(int j=i-1;j>=1;j--){
          if(a[i].s == a[j].s && a[i].num == a[j].num && a[j].sta != "CE")xx ++;
        }
        if(a[i].num == "A"){
          for(int j=1;j<=n;j++){
            if(a[i].s == Edge[j].str){
              if(Edge[j].flag == false) cnt ++;
              Edge[j].flag = true;
              Edge[j].sum += max(A, 500 - (a[i].t * _A) - (xx * 50));
            }
          }
        }
        if(a[i].num == "B"){
          for(int j=1;j<=n;j++){
            if(a[i].s == Edge[j].str){
              if(Edge[j].flag == false) cnt ++;
              Edge[j].flag = true;
              Edge[j].sum += max(B, 1000 - (a[i].t * _B) - (xx * 50));
            }
          }
        }
        if(a[i].num == "C"){
          for(int j=1;j<=n;j++){
            if(a[i].s == Edge[j].str){
              if(Edge[j].flag == false) cnt ++;
              Edge[j].flag = true;
              Edge[j].sum += max(C, 1500 - (a[i].t * _C) - (xx * 50));
            }
          }
        }
        if(a[i].num == "D"){
          for(int j=1;j<=n;j++){
            if(a[i].s == Edge[j].str){
              if(Edge[j].flag == false) cnt ++;
              Edge[j].flag = true;
              Edge[j].sum += max(D, 2000 - (a[i].t * _D) - (xx * 50));
            }
          }
        }
        if(a[i].num == "E"){
          for(int j=1;j<=n;j++){
            if(a[i].s == Edge[j].str){
              if(Edge[j].flag == false) cnt ++;
              Edge[j].flag = true;
              Edge[j].sum += max(E, 2500 - (a[i].t * _E) - (xx * 50));
            }
          }
        }
      }
      ma[p(a[i].s, a[i].num)] = 1;
    }
  }
  sort(Edge+1,Edge+n+1,cmp);
  int yy = 0;
  int yy1 = 0;
    for(int i=1;i<=n;i++){
    yy1 ++;
        if(Edge[i].sum != Edge[i-1].sum)yy = yy1;
        if(Edge[i].str == "cnz"){
            if(Edge[i].flag == true){
                printf("%d\n",Edge[i].sum);
                printf("%d/%d\n",yy , cnt);
            }
            else{
                puts("-1");
            }
            break;
        }
    }
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档