改错第一集

Problem_5

Time Limit: 1000MS MemoryLimit: 65536KB

Submit Statistic

Problem Description

第一学期已经接近尾声了,通往寒假的大门由八位Exam把守。
作为Exam大家族里的二哥,当然要比之前那些Exam们要凶恶的多。
二哥养了一群恶犬,如果你能战胜他们,二哥就放你过去。
当然不是让你赤手空搏,二哥也给你准备了同样数目的几只恶犬。
已知你的每只恶犬只能攻击二哥对应位置的恶犬,
当你的某只恶犬进行攻击时,会同时遭受敌方和其左右两只恶犬的攻击,如果某侧没有恶犬或者已被消灭,则该侧不会对你的恶犬造成伤害。
已知每只斗犬的攻击力,如果你的当前进行攻击的恶犬攻击力大于等于对方及左右两侧恶犬造成的总攻击力,就可以消灭掉敌方对应的那一只恶犬,否则不能消灭对方。
你需要提前计算出能否把二哥的恶犬全部消灭。

Input

多组输入
每组先输入一个整数n(0 < n < = 1000)表示恶犬数目。
第二行n个数ai(0< ai < = 100),表示二哥的n只恶犬的攻击力。
第三行n个数bi(0< bi < = 100),表示你相对应的n只恶犬的攻击力。

Output

每组数据输出一行。如果能把二哥的恶犬全部消灭,则输出“Fighting!!!”
否则输出“QAQ!!!”

Example Input
4
1 1 1 1
2 2 2 2
4
1 1 1 1
1 2 2 1
3
1 1 1
2 1 2
Example Output
Fighting!!!
QAQ!!!
Fighting!!!
Hint

 

 

对于第一组数据,
可以从左到右或者从右到左依次攻击
1 1 1 1
↑ ↑ ↑ ↑
2 2 2 2
如果中间两只任何一只先攻击,由于敌方左右两侧恶犬未被消灭,攻击力低于敌方攻击力,则无法消灭敌方。对于第三组数据,第一只和最后一只必须先消灭敌方对应位置的恶犬,第二只才能消灭敌方第二只。 否则第二只先攻击,攻击力低于敌方第二只联合两侧的攻击力,会被消灭

Author

 LeiQ

刚开始我是分类,首尾去掉,分奇偶,然后奇数情况把最中间的也分别考虑,这样我方恶犬在进行攻击时就会出现不攻击三只的情况,但是会漏掉情况。

经过强哥的指点,我知道我方攻击是从最先有优势的犬开始攻击的,然后通过循环即可实现。

下面是代码实现:

错误的 

#include<stdio.h>

#include<string.h>

#include<math.h>

#include<algorithm>

#include<iostream>

using namespace std;

 

int main()

{

   int a[1002],b[1002],n;

   while(~scanf("%d",&n))

    {

       int i,f=1;

       for(i=1; i<=n; i++)

       {

           scanf("%d",&a[i]);

       }

       for(i=1; i<=n; i++)

       {

            scanf("%d",&b[i]);

       }

       if(n==1)

       {

           if(b[i]>=a[i])

               printf("Fighting!!!\n");

           else

                printf("QAQ!!!\n");

       }

       else

       {

          int k;

       if(n%2==0)

       {

           k=n/2;

       }

       else

           k = (n/2);

       if((b[1]>=(a[2]+a[1]))&&(b[n]>=(a[n]+a[n-1])))

 

       {

           f = 1;

       }

       else

       {

           f = 0;

           printf("QAQ!!!\n");

           continue;

       }

       int u=1;

       for(i=2; i<=k; i++)

       {

           if(b[i]>=(a[i]+a[i+1]))

           {

                f=1;

           }

           else

           {

                f = 0;

                printf("QAQ!!!\n");

               u=0;

                break;

           }

 

       }

       if(!u)

       {

           continue;

       }

       u=2;

       for(i=n-1; i>=k+1; i--)

       {

           if(i==k+1)

           {

                if(b[i]>=a[i])

           {

                f=1;

           }

           else

           {

                f = 0;

                printf("QAQ!!!\n");

                u=0;

                break;

           }

           }

           else

           {

                 if(b[i]>=(a[i]+a[i-1]))

           {

                f=1;

           }

           else

           {

                f = 0;

                printf("QAQ!!!\n");

                u=0;

                break;

           }

 

           }

 

 

       }

       if(!u)

        {

           continue;

       }

 

       if(n%2!=0)

       {

           if(b[(n/2)+1]>=a[(n/2)+1])

           {

                f=1;

           }

           else

           {

                f = 0;

                printf("QAQ!!!\n");

 

               break;

           }

 

       }

       if(f)

       {

           printf("Fighting!!!\n");

       }

 

       }

 

 

    }

 

 

   return 0;

}

正解1:

#include<stdio.h>
int  main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int o=0;
    int a[1002]={0},b[1002]={0},c[1002]={0},d=0;


        int i;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
     for(i=1;i<=n;i++)
    {
        scanf("%d",&b[i]);
    }
    while(1)
    {
           o++;
       for(i=1;i<=n;i++)
    {
        if(b[i]>=(a[i-1]+a[i]+a[i+1]))
        {
            if(a[i]!=0)
            {
                 d++;
            }
            a[i] = 0;
            c[o]++;




        }


    }


    if(c[o-1]==c[o])
    {
        break;


    }


    }


    if(d == n)
    {
        printf("Fighting!!!\n");
    }
    else
    {
        printf("QAQ!!!\n");
    }






    }




    return 0;
}

以上解法判断是用从c[o]也可以;

正确2:

 #include <stdio.h>
#define h 1001
int main()
{
    int i,n,a[h],k,b[h],l;
    while(scanf("%d",&n)!=EOF)
    {
        k=1;
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(i=0;i<n;i++)
            scanf("%d",&b[i]);
        for(l=0;l<n;l++)
        {
            for(i=0;i<n;i++)
            {
                if(i==0)
                {
                    if(b[i]>=a[i]+a[i+1])
                        a[i]=0;
                }
                if(i==n-1)
                {
                    if(b[i]>=a[i]+a[i-1])
                        a[i]=0;
                }
                if(i>0&&i<n-1)
                {
                    if(b[i]>=a[i]+a[i-1]+a[i+1])
                        a[i]=0;
                }
            }
        }
        for(i=0;i<n;i++)
        {
            if(a[i]>0)
                k=0;
        }
        if(k==0)
            printf("QAQ!!!\n");
        else
            printf("Fighting!!!\n");
    }
    return 0;
}
正解三,高效版:

#include<iostream>
#include<cstring>
using namespace std;


int n;
int data1[11234], data2[11234];


void attack(int i)
{
    if (data1[i] == 0)
        return;


    int temp = data1[i]+data1[i+1]+data1[i-1];
    if (data2[i] >= temp && temp)
    {
        data1[i] = 0;
        if (i-1 >= 1)
            attack(i-1);
        if (i+1 <= n)
            attack(i+1);
    }
}


int judge()
{
    for (int i = 1; i <= n; i++)
        attack(i);


    for (int i = 0; i <= n; i++)
        if (data1[i])
            return 0;


    return 1;
}


int main()
{
    while (cin >> n)
    {
        memset(data1,0,sizeof(data1));
        memset(data2,0,sizeof(data2));


        for (int i = 1; i <= n; i++)
            cin >> data1[i];
        for (int i = 1; i <= n; i++)
            cin >> data2[i];


        if (judge())
            cout << "Fighting!!!" << endl;
        else
            cout << "QAQ!!!" << endl;
    }
}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值