题目链接:http://codeforces.com/contest/1339
A
思路:覆盖先看最左边,可知有两种,一个是直接上下“|”类似这样覆盖,那么后面的都只能是上下“ /”类似这样上下覆盖,只有一种,当最左边上下是“ /”这样覆盖时,后面的只要有一个是“|”这样覆盖的,那么情况也就定了,那么一共就n-1中,因此总共有n种
//------------------------------------------------- //Created by HanJinyu //Created Time :一 4/20 20:59:15 2020 //File Name :633A.cpp //------------------------------------------------- #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <list> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; typedef double db; typedef long long ll; const int maxn = 200005; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); ll a; scanf("%lld",&a); ll x; while(a--) { scanf("%lld",&x); printf("%lld ",x); } return 0; }
B
思路:大体就是下图这样,先排序,然后选择中间的两个,若是奇数个数,则往后选中间两个,这样最小的剩下的就是a[0]了,直接放最后就好了。
中间选好了之后,即a[(n-1)/2],a[(n-1)/2+1],在选择a[(n-1)/2]的左边那个数,和a[(n-1)/2+1]右边那个数,这样了中间向两边扩张即可。
//------------------------------------------------- //Created by HanJinyu //Created Time :一 4/20 21:28:30 2020 //File Name :633B.cpp //------------------------------------------------- #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <list> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; typedef double db; typedef long long ll; const int maxn = 200005; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); ll a[maxn]; for(int i=0;i<n;i++) scanf("%lld",&a[i]); sort(a,a+n); printf("%lld %lld ",a[(n-1)/2],a[(n-1)/2+1]); if(n%2==1) { for(int i=(n-1)/2-1;i>=1;i--) { printf("%lld %lld ",a[i],a[n-i]); } printf("%lld ",a[0]); } else { for(int i=(n-1)/2-1;i>=0;i--) { printf("%lld %lld ",a[i],a[n-1-i]); } printf(" "); } } return 0; }
C
思路:他可以任意在K秒给数组任意个数加上2^(k-1),我们只要找到a[i]<a[i-1]的时候,记录m=a[i],只要后面的数小于一开始那个下降的数m,就保留与其差的最大值cha,当a[i]大于那个一开始下降的那个头m,就更新那个数 m,求出cha是2的几次方即可,由于是2^(k-1),故结果还要加1
//------------------------------------------------- //Created by HanJinyu //Created Time :一 4/20 23:18:23 2020 //File Name :633C.cpp //------------------------------------------------- #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <list> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; typedef double db; typedef long long ll; const int maxn = 200005; const int mod=1e9+7; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); ll a[maxn]; bool flag=false; ll m,cha=0; for(int i=0;i<n;i++) { scanf("%lld",&a[i]); if(i!=0&&a[i]<a[i-1]&&flag==false) { flag=true; m=a[i-1]; cha=m-a[i]; } else if(a[i]<m&&flag) cha=max(cha,m-a[i]); else if(a[i]>m&&flag) m=a[i]; } if(flag==false) { printf("0 ");continue; } ll count=0; while(1) { if (cha>>=1) count++; else break; } printf("%lld ",count+1); } return 0; }