codeforce #633 div2
A. Filling Diamonds
给定一个初始的菱形,给定一个\(n\),用这个菱形去覆盖给定\(n\)对应的图形,不同的覆盖即同一个小形状被两个不同的菱形覆盖
发现当一个竖着的被填充后其余的都是斜横着的,所以只需要找竖着的情况,显然等于\(n\)
Code
#include <bits/stdc++.h>
#define pii pair<int,int>
#define p first
#define c second
#define ll long long
using namespace std;
void work(){
int n;
cin>>n;
cout<<n<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
work();
}
}
B. Sorted Adjacent Differences
给定长度\(n\)的一个序列\(a\),重新排\(a\)的顺序使得 $ |a_{1}-a_{2}| \leq |a_{2}-a_{3}| \leq \dots \leq |a_{n-1}-a_{n}|$
排序后两个指针从中间开始两两放即可
Code
#include <bits/stdc++.h>
#define pii pair<int,int>
#define idx first
#define val second
#define ll long long
using namespace std;
const int N=1e5+10;
int a[N];
void work(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
vector<int>ans;
if(n & 1){
ans.push_back(a[n/2+1]);
for(int i=n/2,j=n/2+2;i>=1 && j<=n;i--,j++)
ans.push_back(a[i]),ans.push_back(a[j]);
}
else {
for(int i=n/2,j=n/2+1;i>=1 && j<=n;i--,j++)
ans.push_back(a[i]),ans.push_back(a[j]);
}
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<" ";
puts("");
}
int main(){
int t;
cin>>t;
while(t--){
work();
}
}
C. Powered Addition
给定一个长度为\(n\)的序列,在第\(x\)秒可以对任意一段子序列加\(2^{x-1}\),也可以不加。问最少需要多少秒将序列变成非降序的
每次加\(2^{x-1}\),可以看作是2进制上加某一位,找到每个位置和前面最大值差的最大值,
因为二进制其他位上的可以在最后一秒前被加,所以找到二进制最高位然后+1就是最少的秒数。
Code
#include <bits/stdc++.h>
#define pii pair<int,int>
#define idx first
#define val second
#define ll long long
using namespace std;
const int N=1e5+10;
int a[N];
void work(){
int n;
cin>>n;
int mx=INT_MIN;
int mxv=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]< mx)
mxv=max(mxv,abs(a[i]-mx));
mx=max(a[i],mx);
}
if(mxv==0) {
puts("0");return;
}
int ans=0;
for(int i=0;i<=30;i++){
if(mxv>>i &1){
ans=i;
}
}
cout<<ans+1<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
work();
}
}