• zoj 3757 Alice and Bob and Cue Sports 月赛A 模拟


    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3757

    题意:根据所给的台球规则,按照每次的结果计算最终两人的得分

    单纯的模拟题,分支比较多写起来较繁琐

    注意区分犯规与进球得分的规则:

    只要有犯规行为,都要按照规则给对手加分。无论是否进球。

    当进球时,如果有犯规行为,不仅分要加给对手,还要加上犯规惩罚

      1 #include<cmath>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<iostream>
      5 #include<algorithm>
      6 using namespace std;
      7 #define maxn 10005
      8 int v[1005];
      9 int a,b;
     10 bool flag;//碰谁了
     11 bool flag1;//先碰的球ok
     12 bool flag2;//有球进球
     13 bool flag4;//没碰到球
     14 bool flag3;//target
     15 bool flag0;//白球进洞
     16 int _min,_max;
     17 int firsth;//最大的
     18 int vis[maxn];
     19 int low,high;
     20 
     21 
     22 int main()
     23 {
     24     int n,m,i;
     25     flag=true;
     26     while(~scanf("%d%d",&n,&m))
     27     {
     28         flag=true;
     29         a=b=0;
     30         for(i=1;i<=n;i++)
     31             scanf("%d",&v[i]);
     32         sort(v,v+n);
     33         low=1;//high=n;
     34         _min=v[1];//_max=v[n];
     35         memset(vis,false,sizeof(vis));
     36         while(m--)
     37         {
     38             int p,q;
     39             scanf("%d",&p);
     40             flag4=false;
     41             if(p!=1)
     42             {
     43                 if(p==0)
     44                 {
     45                     flag4=true;
     46                 }
     47                 else
     48                 {
     49                 flag1=false;
     50                 int x;
     51                 firsth=0;
     52                 while(p--)
     53                 {
     54                     scanf("%d",&x);
     55                     if(x>firsth)
     56                         firsth=x;
     57                 }
     58                 }
     59             }
     60             else
     61             {
     62                 scanf("%d",&p);
     63                 if(p!=_min)
     64                     flag1=false;
     65                 else
     66                     flag1=true;
     67                 firsth=p;
     68             }
     69             scanf("%d",&q);//进的球
     70             if(q==0)
     71                 flag2=false;
     72             else
     73                 flag2=true;
     74             int all=0;
     75             int y;
     76             flag0=false;
     77             flag3=false;
     78             for(i=0;i<q;i++)
     79             {
     80                 scanf("%d",&y);
     81                 if(y==0)
     82                 {
     83                     flag0=true;//白球进洞
     84                 }
     85                 if(y==_min)
     86                 {
     87                     flag3=true;//target
     88                 }
     89                 all+=y;
     90                 vis[y]=true;
     91             }
     92             if(flag4)//没碰到任何球
     93             {
     94                 if(flag)
     95                     b+=_min;
     96                 else
     97                     a+=_min;
     98                 flag=!flag;
     99             }
    100             else//碰到球了
    101             {
    102                 if(flag0)//白球进洞
    103                 {
    104                     if(flag)b+=firsth+all;
    105                     else a+=firsth+all;
    106                     flag=!flag;
    107                 }
    108                 else//白球没进洞
    109                 {
    110                     if(flag2)//有球进洞
    111                     {
    112                         if(flag3)//target
    113                         {
    114                             if(flag1)
    115                             {
    116                                 if(flag)a+=all;
    117                                 else b+=all;
    118                             }
    119                             else//没有先碰target进球了
    120                             {
    121                                 if(flag)b+=all+firsth;
    122                                 else a+=all+firsth;
    123                                 flag=!flag;
    124                             }
    125                         }
    126                         else
    127                         {
    128                             if(!flag1)
    129                             {
    130                                 if(flag)b+=firsth;
    131                                 else a+=firsth;
    132                             }
    133                             if(flag)b+=all;
    134                             else a+=all;
    135                             flag=!flag;
    136                         }
    137                     }
    138                     else//没球进洞
    139                     {
    140                         if(!flag1)
    141                         {
    142                         if(flag)
    143                             b+=firsth;
    144                         else a+=firsth;
    145                         }
    146                         flag=!flag;
    147                     }
    148                 }
    149             }
    150             if(vis[_min])
    151             {
    152                 while(vis[v[low]]&&low<=n)
    153                 {
    154                     low++;
    155                 }
    156                 _min=v[low];
    157             }
    158         }
    159         printf("%d : %d
    ",a,b);
    160     }
    161     return 0;
    162 }
    View Code

    (P.S.写的比较丑陋,分支可以优化)

  • 相关阅读:
    我们应当怎样做需求分析
    卓有成效的团队建设经验与见解 Team Leader你会带团队吗?
    一个独立程序员对自己近九个月工作生活的回顾
    KISS My YAGNI,KISS (Keep It Simple, Stupid)和 YAGNI (You Ain’t Gonna Need It)软件开发原则
    程序员新人如何在企业与人打好交道 站在别人的立场想问题,站在自己的立场做事情
    创业团队产品如何战胜大公司的抄袭 腾讯抄你肿么办?
    什么样的程序员才算成熟? 让程序员认清自己的所处的阶段
    HTML的GET方法传递参数样式。
    教您使用java爬虫gecco抓取JD全部商品信息
    JAVA 爬虫Gecco
  • 原文地址:https://www.cnblogs.com/wuwing/p/3577085.html
Copyright © 2020-2023  润新知