A. Filling Diamonds
题意:问 $n$个菱形方块拼成所示的钻石的方案
思路:很明显的是每个图形中有$n$个站着的菱形,选择其中一个其他都会变成躺着的,因此答案为$ n $
#include<iostream> #include<cstdio> using namespace std; int main(){ int t,x; cin>>t; while(t--){ cin>>x; cout<<x<<endl; } return 0; }
B - Sorted Adjacent Differences
题意:给一个数组,要求重新排列后,相邻元素的绝对值不递减
思路:排序后将数组倒着一小一大放置即可
#include<iostream> #include<algorithm> #include<vector> #include<map> using namespace std; typedef long long ll; const int maxn=1e5+10; ll a[maxn],ans[maxn]; int main() { int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); int l=1,r=n; for(int i=n;i>=1;i--){ if((n-i)%2==0){ ans[i]=a[l++]; } if((n-i)%2==1){ ans[i]=a[r--]; } } for(int i=1;i<=n;i++){ if(i!=1) printf(" "); printf("%d",ans[i]); } cout<<endl; } return 0; }
C - Powered Addition
题意:给一个数组,你可以在第$ x $秒给一些元素加上$2^{x-1}$ ,问多少秒后数组可以变成一个不递减序列
思路:找到数组中一组前后差最大的元素即可,然后判断需要加几秒即可
#include<iostream> #include<algorithm> using namespace std; const int maxn=1e5+10; int a[maxn]; int main() { int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int mi=a[n],flag=0,ret=0; for(int i=n-1;i>=1;i--){ if(a[i]>mi) flag=1,ret=max(ret,a[i]-mi); else mi=min(a[i],mi); } if(!flag) cout<<0<<endl; else{ int x=1,cnt=0; while(ret>0){ ret-=x; x*=2; cnt++; } cout<<cnt<<endl; } } return 0; }