两天的卡..
周赛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;
}
}