#include<stdio.h>
typedef struct
{
int blood, tag;//tag==1表示敌人已被消灭
}Blood;
int empty(Blood A[],int n)//判断数组是否所有值均为0,即敌人被全部消灭
{
int i=0;
for(i=0;i<n;i++)
if(A[i].blood>0) break;
if(i==n) return 1;//敌人被全部消灭
else return 0;
}
int die(Blood A[], int n)//检查是否有敌人被消灭
{
int flag=0;
for(int i=0;i<n;i++)
{
if(A[i].blood<=0&&A[i].tag==0)
{
A[i].tag=1; flag=1;
}
}
if(flag==1) return 1;
else return 0;
}
int main()
{
int n, cnt=0; Blood A[10010];//cnt记录子弹数量
while(scanf("%d", &n)!=EOF)
{
cnt=0;
for(int i=0;i<n;i++)
{
scanf("%d",&A[i].blood);//血量
A[i].tag=0;
}
while(!empty(A,n)) //当敌人未被全部消灭时,开枪
{
cnt++;
for(int i=0;i<n;i++)
if(A[i].tag==0)
A[i].blood = A[i].blood-2;
while(die(A,n)&&!empty(A,n))//当本轮有新的敌人被消灭时,其余敌人血量-2
{
for(int i=0;i<n;i++)
if(A[i].blood>0)
A[i].blood = A[i].blood-2;
}
}
printf("%d\n", cnt);
}
return 0;
}
第二种,时间超限
#include<stdio.h>
typedef struct
{
int blood, tag;//tag==1时表示敌人在前几轮已被消灭
}Blood;
int death(Blood A[], int n, int *remain)
{//检查是否有新的敌人被消灭,返回值为1表示有新敌人被消灭
int flag=0;
for(int i=0;i<n;i++)
{
if(A[i].blood<=0&&A[i].tag==0) //有新的敌人被消灭
{
A[i].tag=1; //标记
flag=1;
(*remain)--;
}
}
if(flag==1) return 1;
else return 0;
}
int main()
{
int n, remain=0,cnt=0, flag=0; Blood A[10010];
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d", &A[i].blood);
A[i].tag=0;
}
remain = n, cnt=0, flag=0;
while(remain>0)
{
cnt++;
for(int i=0;i<n;i++) A[i].blood = A[i].blood-2;//开一枪,血量减二
while(death(A,n,&remain)&&remain>0)//检查是否有新的敌人被消灭
{
for(int i=0;i<n;i++)
if(A[i].tag==0) A[i].blood = A[i].blood-2;
}
}
printf("%d\n", cnt);
}
return 0;
}
第三种,还是时间超限,累辽
#include <stdio.h>
void FastSort(int A[], int left, int right)
{//快速排序
if(left<right)
{
int temp=A[left], i=left, j=right;
while(i<j)
{
while(i<j&&A[j]>temp) j--;
if(i<j) A[i]=A[j];
while(i<j&&A[i]<temp) i++;
if(i<j) A[j]=A[i];
}
A[i]=temp;
FastSort(A,left,i-1);
FastSort(A,i+1,right);
}
}
int main()
{
int n, A[10010], cnt=0, p=0;//cnt为子弹数量,p的值为存活的敌人中血量最低的人的下标
int tag=0;//如果有新的敌人被消灭,tag==1;
while(scanf("%d", &n)!=EOF)
{
for(int i=0;i<n;i++) scanf("%d", &A[i]);//输入n个敌人的血量
FastSort(A,0,n-1);//对敌人的血量进行排序
cnt=0, p=0;
while(A[n-1]>0)//血量最多的敌人没有被消灭,则意味着还要开枪
{
cnt++;
for(int i=p;i<n;i++) A[i]-=2;//开一枪,血量减2
//检查是否有新的敌人被消灭,将p重新指向存活的敌人中血量最低的人的下标
while(A[p]<=0&&p<n)
{//有新的敌人被消灭
while(A[p]<=0&&p<n) p++;
for(int i=p;i<n;i++) A[i]-=2;
}
}
printf("%d\n", cnt);
}
return 0;
}