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();
	}
}
posted @ 2020-05-19 23:57  Hyx'  阅读(135)  评论(0编辑  收藏  举报