藍橋杯:VIP試題 算法訓練 找零錢
資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
有n個人正在飯堂排隊買海北雞飯。每份海北雞飯要25元。奇怪的是,每個人手裏只有一張鈔票(每張鈔票的面值爲25、50、100元),而且飯堂阿姨一開始沒有任何零錢。請問飯堂阿姨能否給所有人找零(假設飯堂阿姨足夠聰明)
輸入格式
第一行一個整數n,表示排隊的人數。
接下來n個整數a[1],a[2],…,a[n]。a[i]表示第i位學生手裏鈔票的價值(i越小,在隊伍裏越靠前)
輸出格式
輸出YES或者NO
樣例輸入
4
25 25 50 50
樣例輸出
YES
樣例輸入
2
25 100
樣例輸出
NO
樣例輸入
4
25 25 50 100
樣例輸出
YES
數據規模和約定
n不超過1000000
#include<iostream>
#include<string>
using namespace std;
int main(){
long n;
int flag = 1;
int *a = new int[1000001];
int b[2] = {0,0}; //表示當前25元和50元的紙張數 ,b[0]:25 b[1]:50
cin>>n;
for(int i = 1;i <= n;i++){
cin>>a[i];
}
for(int i = 1;i <= n;i++){
if(a[1] == 50 ||a[1] == 100){//如果第一張是50or100則無法找零
cout<<"NO";
flag = 0;
break;
}
/*從第i張開始 無法找零的情況
1.當前收到50元時,沒有25元找
2.當前收到100元時:
①沒有50元現鈔並且25元的數目少於三張
②有50元現鈔但是沒有25元現鈔
*/
if((a[i]==50 && b[0] == 0)||(a[i]==100 && ((b[0] < 3&&b[1]==0) || (b[1]>0 &&b[0]==0)))){
cout<<"NO";
flag = 0;
break;
}
if(a[i] == 25){
b[0]++;
flag = 1;
}else if(a[i] == 50){
b[1]++;
b[0]--;
flag = 1;
}else if(a[i] == 100){
b[0]--;
b[1]--;
flag = 1;
}
}
if(flag == 1){
cout<<"YES";
}
delete[] a;
return 0;
}