六月十九日測試 五顏六色的小動物
阿新 • • 發佈:2017-06-20
現在 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("%lldView Code",&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); }
六月十九日測試 五顏六色的小動物