地址: 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; } }