列表

详情


NC24322. 妖怪大乱斗

描述

某一天妖怪部落的妖怪们为了争当妖王发生了内斗,每个妖怪都发了疯似的攻击同伴,在这种无休止的战斗里,活到最后的妖怪才可以当妖王。

已知部落里有n个妖怪,每个妖怪具有生命值hp和攻击力attack两种属性,且每个妖怪单次攻击的attack与其hp相同。例如当一个妖怪m1hpx,被另外一个hpy的妖怪m2攻击后,m1hp就会变成x-y,妖怪的hp<=0时立刻死亡退出战斗。每一轮战斗中一个存活的妖怪可以选择攻击其他任意一个存活的妖怪一次或者不发动攻击,直到只有一个妖怪存活时战斗结束。

求内斗完后的妖王hp值最低可能是多少。

输入描述

第一行一个n(1≤n≤105),表示妖怪个数。
第二行每行n个数,第i个数ai表示第i只妖怪的hp值(1≤ai≤109

输出描述

一个数,表示妖王最低的hp值。

示例1

输入:

3
3 1 2

输出:

1

说明:

第二只妖怪攻击其他所有妖怪,其他所有妖怪都不攻击,最后只有第二只存活。

示例2

输入:

2
4 6

输出:

2

说明:

4攻击6,变成4 2;

2攻击4,变成2 2;

2攻击2,变成2 0;

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang 3.9) 解法, 执行用时: 47ms, 内存消耗: 752K, 提交时间: 2019-04-13 14:31:18

#include<stdio.h>
int main(){
	int N,n[100000],i,j,flag=0;
	scanf("%d",&N);
	for(i=0;i<N;i++)scanf("%d",n+i);
	for(;;){
		for(i=0;i<N;i++){
			if(n[i]>0){
				for(j=0;j<N;j++){
					if(n[j]>=n[i]&&j!=i){
						n[j]-=n[i];
						flag=1;
					}
				}
			}
		}
		if(flag==0)break;
		flag=0;
	}
	for(i=0;i<N;i++){
		if(n[i]>0)printf("%d",n[i]);
	}
}

C++14(g++5.4) 解法, 执行用时: 30ms, 内存消耗: 876K, 提交时间: 2019-07-17 17:34:53

#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=0;i<t;i++)
    {
        scanf("%d",&a[i]);
        
    }
    int gccd=a[0];
    for(int i=1;i<t;i++)
    {
        gccd=__gcd(gccd,a[i]);
    }
    cout<<gccd<<endl;
}

C++(clang++11) 解法, 执行用时: 19ms, 内存消耗: 784K, 提交时间: 2021-03-13 22:17:35

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[100050];
int main()
{
    int n; 
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    int gcd = a[1];
    for(int i=2;i<=n;i++) gcd = __gcd(gcd,a[i]);
    printf("%d\n",gcd);
}

上一题