【待优化,时间超限】1207

在这里插入图片描述

#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;
}
发布了98 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43661234/article/details/103882953