Problem_5
Time Limit: 1000MS MemoryLimit: 65536KB
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:
#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;
}
}