Codeforces Round #633 (Div. 2)
原创
©著作权归作者所有:来自51CTO博客作者wx63316144dde40的原创作品,请联系作者获取转载授权,否则将追究法律责任
地址: https://codeforces.com/contest/1339
解析:最近a题题意都好长啊.....这道题直接看有几个竖着的菱形就可以了,输入n,输出n。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=3e5+100;
ll v[maxn];
ll a[maxn],b[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
ll n;
cin>>n;
cout<<n<<endl;
}
}
题意:将给出的数列进行重新排列,使两两之间的差逐渐增大。
解析:排个序,从中间向两边扩散取就可以了,每次取这个数和它在右边对应的数。注意n是奇数的时候,先把a[mid]打印出来。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
ll a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
ll x;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
int mid=n/2;
if(n%2!=0)
cout<<a[mid]<<" ";
for(int i=mid-1;i>=0;i--)
{
if(i>0)
cout<<a[i]<<" "<<a[n-1-i]<<" ";
else
cout<<a[i]<<" "<<a[n-1-i]<<endl;
}
// cout<<endl;
}
}
题意:那个aij我是没看懂什么意思。不过不影响理解题意,就是说第x秒可以对任意几个位置+2^(x-1)。要求把整个数列变成非递减数列,最快需要几秒。
解析:取最大递减差值maxx,看从0到maxx需要多少秒即可。注意求这个maxx,不能O(n*n)地找,我就在这里T了一次。只要一个for里每次更新最大值mx和最大差值即可。因为对于当前a[i],最大值要么在它头上,要么在它前面,在它头上,就说明当前位置之前没有出现递减现象。在它前面,就说明出现了递减,更新这个差值,每次max取最大差值即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
const int minnx=2e9;
ll a[maxn];
ll v[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
int ok=0;
for(int i=1;i<n;i++)
{
if(a[i-1]>a[i])
{
ok=1;break;
}
}
if(!ok)
{
cout<<"0"<<endl;continue;
}
ll mx=a[0],maxx=0;
for(int i=0;i<n;i++)
{maxx=max(maxx,mx-a[i]);
mx=max(mx,a[i]);
}
ll cnt=0,k=1;
ll sum=0;
while(1)
{
sum+=k;
cnt++;
k=k*2;
if(sum>=maxx)
break;
}
cout<<cnt<<endl;
}
}