1. 程式人生 > >六月十九日測試 五顏六色的小動物

六月十九日測試 五顏六色的小動物

現在 height using 相互 fine for 是我 alt width

題目描述

1.題目描述:
小東東上小學了, 作為獎品東東爸送給小東東一些小動物。 每個小動物都有一個固定的顏色和大小。
小東東在給小動物們一個編號後發現:第i個小動物的顏色是i,大小是Ai。 每個小動物i可以吸收大小不超過是它兩倍的另一個小動物。 當顏色是x、大小是Ax的小動物x溶解顏色是y和大小是Ay的小動物y時( Ay≤2*Ax) , 它們會變成一個顏色是x,大小是Ax + Ay小動物。
註:由於小動物大小的原因,它們相互都有可能吸收對方。
很顯然最後只會剩一個小動物。
現在小東東想知道, 最後剩下的一個小動物可能的顏色種數。
2.輸入:
第一行一個整數N表示有多少小動物。
第二行包含N個整數,每個整數Ai表示第i個小動物的大小。
3.輸出:

一個整數,表示最後剩下的一個小動物可能的顏色種數。

4.樣例:
1.
輸入1:

3

3 1 4


2. 輸出1:

2
3.
樣例解釋:
可能的顏色是1, 3。 一種可能:第三個小動物溶解第二個小動物,之後第一個小
動物溶解了第三個小動物,最後剩下的小動物顏色是1。
4. 輸入2:

5

1 1 1 1 1
5. 輸入2:

5
6.
樣例解釋:
最後每個小動物都有可能剩下
5.數據範圍:
2≤N≤100000
1≤Ai≤109

這道題可以說是一道貪心的題目,我們將數據排序就會發現,最大的一定可以留下

第二大的可以吃掉所有他前面的,如果他吃掉了所有他前面的大小*2>=最大的,它也可以留下

同理一直向前判斷,知道有一個a[i]吃掉它前面所有的和*2<a[i+1],則他及他前面的都不可能留下。

下面是我寫的代碼

技術分享
#include<iostream> 
#include<cstdio> 
#include<cstring> 
#include<algorithm> 
#define ll long long 
using namespace std; 
ll sum1[100001]={0},a[100001]; 
int main() 
{ 
    ll i,j; 
    ll n; 
    scanf("%lld",&n); 
    for(i=1;i<=n;i++) 
    { 
        scanf("%lld
",&a[i]); } if(n==1) { cout<<"1"; return 0; } sort(a,a+n+1); for(i=1;i<=n;i++) { sum1[i]=sum1[i-1]+a[i]; } ll count=1; ll step,step1=0; if(sum1[n-1]*2>=a[n]) { count++; step=1; } else step=0; if(step!=0) { for(i=n-2;i>=1;i--) { if(sum1[i]*2>=a[i+1]) { count++; } else break; } } printf("%lld",count); }
View Code

六月十九日測試 五顏六色的小動物