hdu 1107 武林【模拟】

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1107

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=2000+10;
typedef struct Node
{
    int x,y;
    int level,in,out,lift;//门派,内力,外力,生命值
    bool flag,dir;//标记是否比过无,方向(正方向,反方向)
};
Node n[maxn];
int map[13][13],num;
int effect(int i)//计算战斗力
{
    switch(n[i].level)
    {
        case 1:return (int)(((0.5*n[i].in+0.5*n[i].out)*(n[i].lift+10)*1.0)/100);
        case 2:return (int)(((0.8*n[i].in+0.2*n[i].out)*(n[i].lift+10)*1.0)/100);
        case 3:return (int)(((0.2*n[i].in+0.8*n[i].out)*(n[i].lift+10)*1.0)/100);
    }
}
void move(int i)//移动
{
    if(n[i].level==1)
    {
        if(n[i].x==12&&n[i].dir)
        {
            n[i].dir=false;
            n[i].x--;
        }
        else if(n[i].x==1&&!n[i].dir)
        {
            n[i].dir=true;
            n[i].x++;
        }
        else
        {
            if(n[i].dir)n[i].x++;
            else n[i].x--;
        }
    }
    else if(n[i].level==2)
    {
        if(n[i].y==12&&n[i].dir)
        {
            n[i].dir=false;
            n[i].y--;
        }
        else if(n[i].y==1&&!n[i].dir)
        {
            n[i].dir=true;
            n[i].y++;
        }
        else
        {
            if(n[i].dir)n[i].y++;
            else n[i].y--;
        }
    }
    else
    {
        if(n[i].x==12&&n[i].y==1)
        return;
        if(n[i].x==1&&n[i].y==12)
        return;
        if((n[i].x==12||n[i].y==12)&&n[i].dir)
        {
            n[i].dir=false;
            n[i].x--;
            n[i].y--;
        }
        else if((n[i].x==1||n[i].y==1)&&!n[i].dir)
        {
            n[i].dir=true;
            n[i].x++;
            n[i].y++;
        }
        else
        {
            if(n[i].dir)
            {
                n[i].x++;
                n[i].y++;
            }
            else
            {
                n[i].x--;
                n[i].y--;
            }
        }
    }
}
void fight()
{
    for(int i=0;i<num;i++)
    n[i].flag=false;
    for(int i=0;i<num;i++)
    {
        if(map[n[i].x][n[i].y]==2&&n[i].lift>0&&!n[i].flag)//如果当前位置有2个人且此人生命值》0,未打过架
        {
            for(int j=0;j<num;j++)
            {
                if(n[i].x==n[j].x&&n[i].y==n[j].y&&n[i].level!=n[j].level&&n[j].lift>0 )//这2人不同门派,此人未打过架,生命值》0
                {
                    int e1=effect(i);
                    int e2=effect(j);
                    n[i].lift-=e2;
                    n[j].lift-=e1;
                    n[i].flag=n[j].flag=true;
                }
            }
        }
    }
    memset(map,0,sizeof(map));
    for(int i=0;i<num;i++)//更新每个人的位置
    {
        move(i);
        if(n[i].lift>0)
        map[n[i].x][n[i].y]++;
    }
}
int main()
{
    int T,N,sum[4][2];
    char c[2];
    scanf("%d",&T);
    while(T--)
    {
        num=0;
        scanf("%d",&N);
        memset(map,0,sizeof(map));
        while(~scanf("%s",c)&&c[0]!=‘0‘)
        {
            scanf("%d%d%d%d%d",&n[num].x,&n[num].y,&n[num].in,&n[num].out,&n[num].lift);
            n[num].dir=true;
            if(c[0]==‘S‘)n[num].level=1;
            else if(c[0]==‘W‘)n[num].level=2;
            else n[num].level=3;
            map[n[num].x][n[num].y]++;
            num++;
        }
        while(N--)
        {
            fight();
        }
        memset(sum,0,sizeof(sum));
        for(int i=0;i<num;i++)
        {
            if(n[i].level==1&&n[i].lift>0)
            {
                sum[1][0]++;
                sum[1][1]+=n[i].lift;
            }
            else if(n[i].level==2&&n[i].lift>0)
            {
                sum[2][0]++;
                sum[2][1]+=n[i].lift;
            }
            else if(n[i].level==3&&n[i].lift>0)
            {
                sum[3][0]++;
                sum[3][1]+=n[i].lift;
            }
        }
        for(int i=1;i<=3;i++)
        printf("%d %d\n",sum[i][0],sum[i][1]);
        printf("***\n");
    }
    return 0;
}
时间: 2024-10-13 16:18:15

hdu 1107 武林【模拟】的相关文章

hdu 4964 Emmet(模拟)

题目链接:hdu 4964 Emmet 题目大意: 给定语句,按照语法翻译并输出. 解题思路:用递归模拟文法分析,主要注意几点: 括号并且的情况:(fuck)(you) 括号嵌套的情况:((fuck.you)) 优先输出id,然后是class(题目中有说) 乘法的部分:fuck*2>you*3 (每次执行fuck时,you的地方同样被执行了3次) 其他跑出样例基本没问题,具体看代码. #include <cstdio> #include <cstring> #include

HDU 4891 简单模拟

The Great Pan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1035    Accepted Submission(s): 355 Problem Description As a programming contest addict, Waybl is always happy to take part in vario

hdu 4194(模拟)

符合三者之一的则不满足规定,求不满足规定的个数.直接模拟. 1.被同一个人审查多次 2.被和自己同一组织的审查 3.被审查次数不等于k 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-28 17:36 5 * Filename :

HDU 4903 (模拟+贪心)

Fighting the Landlords Problem Description Fighting the Landlords is a card game which has been a heat for years in China. The game goes with the 54 poker cards for 3 players, where the “Landlord” has 20 cards and the other two (the “Farmers”) have 1

hdu1107武林(模拟题)

Problem Description 在一个有12行12列的方形的武林世界里,少林.武当和峨嵋三派的弟子们在为独霸武林而互相厮杀.武林世界的第一行的一列格子的坐标是(1, 1),第一行第二列坐标是(1, 2)--右下角的坐标为(12, 12).如图: 少林派弟子总是在同一列回不停地行走.先往下走,走到头不能再走时就往上走,再到头则又往下走--比如,(1, 1) -> (2, 1) -> (3, 1). 武当派弟子总是在同一行来回不停地行走.先往右走,走到头不能再走时就往左走,再到头则又往右走

HDU 2100 Lovekey 模拟26进制

Problem Description XYZ-26进制数是一个每位都是大写字母的数字. A.B.C.-.X.Y.Z 分别依次代表一个0 ~ 25 的数字,一个 n 位的26进制数转化成是10进制的规则如下 A0A1A2A3-An-1 的每一位代表的数字为a0a1a2a3-an-1 ,则该XYZ-26进制数的10进制值就为 m = a0 * 26^(n-1) + a1 * 26^(n-2) + - + an-3* 26^2 + an-2*26 + an-1 一天vivi忽然玩起了浪漫,要躲在学校

HDU 4288 Coder(模拟) 附:upper_bound与lower_bound的比较

HDU 4288 题意:太长..点进去自己看吧 思路: 一道模拟题,但直接模拟会卡TLE,所以进行些许优化,将复杂度/5. 简而言之就是用一个有序数组来模拟set. 优化是利用lower_bound函数,这里简介下lower_bound 与 upper_bound 的区别: 摘自:http://blog.csdn.net/weiguang_123/article/details/7987823 lower_bound返回[First,last)中,可以插入value的第一个位置,使得插入后仍旧满

【HDOJ】1107 武林

简单模拟,题目数据太弱太弱了. 1 /* 1107 */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <vector> 7 #include <algorithm> 8 using namespace std; 9 10 typedef struct node_t { 11 int x, y

HDU 4121 Xiangqi 模拟

原题: http://acm.hdu.edu.cn/showproblem.php? pid=4121 题目: Xiangqi Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4809 Accepted Submission(s): 1134 Problem Description Xiangqi is one of the most pop