题目
薯条哥是一位珠宝设计师,她正在准备一场珠宝展。她有一系列独特的珠宝作品,每件都有其独特的价值。为了让展览更有趣,薯条哥决定按照特殊的顺序展示她的作品。她想按照以下规则来决定展示顺序:
a.首先选择价值居中的作品(如果作品数量为奇数)或两个中间价值的作品中较小的一个(如果作品数量为偶数)。
b.展示选中的作品,并将其从列表中移除。
重复步骤a和b,直到所有作品都被展示。
薯条哥想知道按照这个规则,她的珠宝作品会以什么顺序被展示。
题目
思路
双指针算法,首先对数组排序,然后两个指针分别指向中间数(n-1)>>1, n>>1,每当l==r的时候,代表存在中位数,其他情况一起输出。最后,都要移动指针
java代码
import java.io.*;
import java.util.*;
public class Main{
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static int N = (int)1e5+10;
static int[] a = new int[N];
public static int nextInt()throws IOException{
in.nextToken();
return (int)in.nval;
}
public static void main(String[] args)throws IOException{
int n = nextInt();
for(int i=0; i<n; i++) a[i] = nextInt();
Arrays.sort(a, 0, n);
int l = n-1>>1, r = n>>1;
while(l>=0 && r<n){
if(l==r) out.print(a[l]+" ");
else out.print(a[l]+" "+a[r]+" ");
l--;
r++;
}
out.flush();
out.close();
}
}
c++代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1E5+10;
int a[N];
int n;
int main(){
scanf("%d", &n);
for(int i=0; i<n; i++) scanf("%d", &a[i]);
sort(a, a+n);
int l = (n-1)>>1, r = n>>1;
while(l>=0 && r<n){
if(l==r) printf("%d ", a[l]); //奇数情况
else printf("%d %d ", a[l], a[r]); //偶数情况
l--, r++;
}
return 0;
}
题目
薯条哥是一位数学爱好者,她相信每个人都有自己的幸运数字。最近她发现,任何一个正整数都可以表示成若干个不同的2的次幂与3的次幂之和的形式,即:
现在,薯条哥希望你能帮她找到给定正整数的这样一个表示法,并将其中的个不同的整数 从大到
小依次输出。
思路
这题就是唬人的,因为所有的数都可以转变为二进制,所以不需要考虑三进制的事情,只用转二进制即可
java代码
import java.io.*;
import java.util.*;
public class Main{
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
public static int nextInt()throws IOException{
in.nextToken();
return (int)in.nval;
}
public static void main(String[] args)throws IOException{
int T = nextInt();
while(T-->0){
int x = nextInt();
List<Integer> a = new ArrayList<>();
for(int i=30; i>=0; i--){
if((x>>i&1)==1) a.add(1<<i);
}
out.println(a.size());
for(Integer e : a) out.print(e+" ");
out.println();
}
out.flush();
out.close();
}
}
c++代码
#include<cstdio>
#include<vector>
using namespace std;
int main(){
int T;
scanf("%d", &T);
while(T-->0){
int x;
scanf("%d", &x);
vector<int> a;
for(int i=30; i>=0; i--){
if((x>>i&1)==1) a.push_back(1<<i);
}
printf("%d\n", a.size());
for(int e : a) printf("%d ", e);
puts("");
}
return 0;
}