两天的卡..
周赛a题:
主要思路:在n个团队中如果隔一个做一个可以坐下那么说明可以坐下,但是在出现1的时候可以坐在空开的那个位置上特殊判断一下。
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
ll n,l;
ll a[200005];
int main(){cin>>n>>l;for(int i=0;i<n;i++) cin>>a[i];ll t=0,f=0;for(int i=0;i<n;i++){if(t+a[i]<=l){t+=a[i]+1;}else if(a[i]!=1){f=1;break;}}if(f==0) cout<<"Yes"<<endl;else cout<<"No"<<endl;
}
cf原题链接:Problem - D - Codeforces
主要思路:找可以变选择的范围。在升序段中找最小的两个然后取中间值,如果都减去这个中间值也还是升序段,在降序段中找最大的两个数取中间值,所有数减去这个中间值就会变成最小值。最后再确定能不能有值是要判断这两个范围是否有交集。有就输出,没有就没有这样的值。
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
typedef long long ll;
using namespace std;
ll a[200005];
int main(){ll t,n;cin>>t;while(t--){cin>>n;ll jd=1e9,jx=0;cin>>a[0];for(int i=1;i<n;i++){ll x=0,y=1e9;cin>>a[i];if(a[i]>a[i-1]){y=(a[i]+a[i-1])/2;}if(a[i]<a[i-1]){x=(a[i]+a[i-1]+1)/2;}jx=max(jx,x),jd=min(jd,y);}if(jx<=jd) cout<<jx<<endl;else cout<<"-1"<<endl;}
}