• hdu 4023 Game 博弈论


    思路:

    将15种分成5类:

    1.1和2为一类;

    2.3,4,5,6为一类;

    3.7,8,9,10为一类;

    4.11,12,13,14,15为一类;

    5.15为一类。

    比较各类的优先级,就会发现放置的顺序为5->2->4->3->1.

    代码如下:

      1 #include<iostream>
      2 #include<stdio.h>
      3 #include<algorithm>
      4 #include<iomanip>
      5 #include<cmath>
      6 #include<cstring>
      7 #include<vector>
      8 #define ll __int64
      9 #define pi acos(-1.0)
     10 #define MAX 50000
     11 using namespace std;
     12 int p[16];
     13 int fun1(int n)
     14 {
     15     if(n&1) return n-1;
     16     return n;
     17 }
     18 int fun2(int n)
     19 {
     20     if(n&1) return n+1;
     21     return n;
     22 }
     23 int main(){
     24     int t,a,b,k,i,j,ca=0,ans;
     25     scanf("%d",&t);
     26     while(t--){
     27         a=b=0;
     28         int num1,num2,num34,num56,num78,num910,num11_14,num15;
     29         bool flag=0;
     30         for(i=1;i<=15;i++)
     31             scanf("%d",&p[i]);
     32         if(p[1]>p[2]) num1=p[1]-p[2],num2=0;
     33         else num2=p[2]-p[1],num1=0;
     34         if(p[3]+p[4]>p[5]+p[6]) num34=p[3]+p[4]-p[5]-p[6],num56=0;
     35         else num56=p[5]+p[6]-p[4]-p[3],num34=0;
     36         if(p[7]+p[8]>p[9]+p[10]) num78=p[7]+p[8]-p[9]-p[10],num910=0;
     37         else num910=p[9]+p[10]-p[8]-p[7],num78=0;
     38         num11_14=p[11]+p[12]+p[13]+p[14];
     39         num15=p[15];
     40         if(p[15]&1){
     41             a+=2;
     42             flag=1;
     43         }
     44         if(num34){
     45             if(flag){
     46                 a+=num34/2;
     47                 b+=fun2(num34);
     48                 if(num34&1) flag=0;
     49             }
     50             else{
     51                 a+=(num34+1)/2;
     52                 b+=fun1(num34);
     53                 if(num34&1) flag=1;
     54             }
     55         }
     56         else{
     57             if(flag){
     58                 b+=(num56+1)/2;
     59                 a+=fun1(num56);
     60                 if(num56&1) flag=0;
     61             }
     62             else{
     63                 a+=fun2(num56);
     64                 b+=num56/2;
     65                 if(num56&1) flag=1;
     66             }
     67         }
     68         if(num11_14&1){
     69             if(flag) b++;
     70             else a++;
     71             flag=!flag;
     72         }
     73         if(num78){
     74             if(flag){//B
     75                 b+=(num78+1)/2;
     76                 a+=num78;
     77                 if(num78&1) flag=0;
     78             }
     79             else{//A
     80                 a+=num78;
     81                 b+=num78/2;
     82                 if(num78&1) flag=1;
     83             }
     84         }
     85         else{
     86             if(!flag){ //A
     87                 a+=(num910+1)/2;
     88                 b+=num910;
     89                 if(num910&1) flag=1;
     90             }
     91             else{//B
     92                 b+=num910;
     93                 a+=num910/2;
     94                 if(num910&1) flag=0;
     95             }
     96         }
     97         a+=num1*2;
     98         b+=num2*2;
     99         printf("Case #%d: ",++ca);
    100         puts(a>b?"Alice":"Bob");
    101     }
    102     return 0;
    103 }
    View Code
  • 相关阅读:
    Nmap参数详解(含扫描参数原理解释)
    为什么服务器突然回复RST——小心网络中的安全设备
    Security+学习笔记
    《HTTPS权威指南》读书笔记——PKI
    [Android 搞机]Twrp 中清除 data 和搞机清除的区别
    [C语言学习笔记五]复合语句和操作符的区分
    [C语言学习笔记四]变量与系统的交互
    [C语言学习笔记三]格式化输出和输入
    [C语言学习笔记二] extern 函数的用法
    [C语言学习笔记一]基本构架和变量
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3293122.html
Copyright © 2020-2023  润新知