昨天的,只能补到,没有精力了。
这次总体属于正常发挥,赛场上开出了,但是是猜的,不懂。。。
:送分题,但是我还了一次,大概思路就是扫一遍差值,最后一个差值要,然后找出最大值即可。
:说实话我也不知道咋过的,就模拟了几个样例,发现了一个规律,如果,那么就不用管,否则就要。然后最后一个就没了。
:赛后问的,就是考虑最多只需要次就可以把所有数变成相等,因为最大就是,然后我们每次操作时候维护一下序列的最大值和最小值,如果某次序列的最大值与最小值相等,那么显然可以出循环,否则,如果最大值是奇数,那么所有数即可,否则就选,毕竟我们每次操作的目标其实就是缩短最大值与最小值的差距。
代码
:
#include <bits/stdc++.h>
#define ll long long
#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
int t,n,l;
int a[1010];
void solve(){
cin>>n>>l;
int maxn=0;
for(int i=1;i<=n;i++) cin>>a[i];
a[n+1]=l;
// if(n==1){
// cout<<l<<endl;
// return;
// }
maxn=a[1];
for(int i=2;i<=n+1;i++){
//cin>>a[i];
if(i!=n+1) maxn=max(maxn,a[i]-a[i-1]);
else maxn=max(maxn,2*(a[i]-a[i-1]));
}
cout<<maxn<<"\n";
}
int main(){
IOS;
cin>>t;
while(t--) solve();
return 0;
}
:
#include <bits/stdc++.h>
#define ll long long
#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
int t,n,l;
int a[201000];
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
ll ans=a[1]-1;
for(int i=2;i<=n;i++){
if(a[i]>a[i-1]) ans+=a[i]-a[i-1];
}
cout<<ans<<"\n";
}
int main(){
IOS;
cin>>t;
while(t--) solve();
return 0;
}
:
#include <bits/stdc++.h>
#define ll long long
#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
int t,n,l;
int a[201000];
vector<int> v;
void solve(){
cin>>n;
v.clear();
int cnt=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=31;i++){
int maxn=a[1],minn=a[1];
for(int j=1;j<=n;j++){
minn=min(minn,a[j]);
maxn=max(maxn,a[j]);
}
if(maxn==minn){
cnt=i;
break;
}
if(maxn%2==0) v.push_back(1);
else v.push_back(0);
for(int j=1;j<=n;j++){
a[j]=(a[j]+v[v.size()-1])/2;
}
}
cout<<cnt-1<<"\n";
// cout<<cnt-1<<"n";
if(cnt-1<=n && cnt-1>0){
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
cout<<"\n";
}
// cout<<ans<<"\n";
}
int main(){
IOS;
cin>>t;
while(t--) solve();
return 0;
}
再接再厉,不要放弃,一定能实现梦想!