煙大校賽2020聖誕爺爺的禮物

白雲裡蹦跳的心暖發表於2020-11-17

G. 聖誕爺爺的禮物 [ Problem 4864 ] [ Discussion ]
Description
聖誕節快要到了,聖誕老爺爺要打包n 份糖果分給小朋友們,假設聖誕老爺爺已經打包好了m 份糖果了。恰好輪到小明瞭,小明因為是裡面最小的小朋友,所以小明可以要兩份,並且可以提出要求,小明希望能分到這n 份糖果中最多糖果的一份和最少糖果的一份,並且裡面的糖果恰好為a 和b 個,這可難到聖誕老爺爺了,打包好的不可以拆開,剩下的n−m 份都可以現裝糖果,問能否滿足小明的要求。

Input
輸入包含兩行:

第一行輸入n,m,a,b, 其中a 和b 的大小關係不確定。

第二行表示已經打包好的m 份糖果各自數量1≤n,m,a,b≤1000, m≤n
Output
輸出YES 或者NO

Samples
Input Copy
3 2 1 2
1 2
Output
YES
Source
2020年煙大校賽
Discussions
No more discussions

More>>
這個題我只要找出輸出YES情況或者NO情況就好啊,幾種情況討論下,如果YES條件容易找就特判YES否則特判NO;

#include<bits/stdc++.h>
using namespace std;
long long s[10000];//陣列開大了,問題不大;
int main(){
	long long n,m,a,b,i;//long long 也開大了 問題不大;
	cin>>n>>m>>a>>b;
	for(i=0;i<m;i++){
		cin>>s[i];
	}
	int max,min;
	max=s[0];
	min=s[0];
	for(i=0;i<m;i++){
		if(s[i]>max){
			max=s[i];
		}
		if(s[i]<min){
			min=s[i];
		}            //找出最值;
	}
	int t;
	if(a>b){
		t=a;a=b;b=t;//a,b,大小不確定,那我就讓他確定確定?
	}
	if(n-m==0){
		if(max==b&&min==a&&m!=1&&n!=1){//n-m=0;說明沒有帶子裝了,要輸出YES只能在所裝的袋子裡滿足max==b,min==a;
			cout<<"YES";//此處需要特判n=1;
		}//因為小明最少要兩袋,n=1說明只能打包一份,只能輸出NO;(易錯)
		else
			cout<<"NO";
	}
	if(n-m==1){            //如果n-m==1;說明還有一個袋子可以裝;(n,m>=1,不考慮m=0,自然不需要特判n=1,題幹題幹題幹)
		if(max==b){        //而我需要最大份恰好為b,最小份恰好為a,如果其中一項成立;
			if(min>=a){    //那麼只剩一個袋子的話,①讓最大份等於b,如果已裝最小值大於a,我就可以用剩餘的那個袋子去裝a,從而滿足需求;
				cout<<"YES";
	}
			else{
			
				cout<<"NO";
		}
		}
		else if(min==a){//②如果最小份等於最小值,用那個帶子去滿足最大值;
			if(max<=b){//如果已裝max比b小,那麼我可以用那個袋子去裝b個糖,從而滿足最大份的值恰好為b;
				cout<<"YES";
			}
			else{
				cout<<"NO";
			}
		}
	}
	if(n-m>=2){
		if(max>b||min<a){//最大份大於b,最小份小於a;所以不可能湊出來最大份再等於b,最小份再等於a;
			cout<<"NO";
		}
		else{
			cout<<"YES";
		}
	}
//	cout<<max<<" "<<min<<" "<<a<<" "<<b<<endl;
	
	return 0;
}

其實我感覺我的方法有點麻煩 而且其實我特判n=1沒想到(太笨了),希望有大佬更簡單的解法!!!

相關文章