题目意思:求B数组(B[0]除外), 每个B[i]是所有A[j](i不能整除j)中的最大值, 就是剔除下标是i的倍数的数啦。
思路:要什么就找什么的方式硬干是很难受的, 思路转一下。既然是求最大值, 那么就看最大值是谁的菜了不是?假设最大值下标为j, 则只要最大值下标j不是i的倍数,就可以确定B[i]=A[j]。详细内容见代码和注释
#include <cstring>
#include <cstdio>
#include <iostream>
#include <string>
#include <climits>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
typedef long long LL;
#define MAXN_NUM 0x3f3f3f3f
#define EPS 1e-6
#define DGA(x)
#define DFA(x)
#define PRT(x,a) printf("%s%d%s\n",a,x,a)
#define TEST(x) printf("---------test %c---------\n",x+'A')
#define Fin(i,f,t) for(int i=f;i<=t;++i)
#define Fde(i,f,t) for(int i=f;i>=t;--i)
#define SfI(x) scanf("%d",&x)
#define SfLL(x) scanf("%lld",&x)
#define SfD(x) scanf("%lf",&x)
#define SfC(x) scanf("%c",&x)
#define SfS(x) scanf("%s",x)
#define MAXN 6
struct node{
int v,p;//值和下标
node(){}
node(int v, int p):v(v), p(p){}
bool operator<(const node& a) const{
if(v!=a.v) return v<a.v;
return p<a.p;
}
}nd;
priority_queue<node> que;
const int maxn=1e5+100;
int ans[maxn];
int main(void){
DFA(freopen("D:\\test.txt","r",stdin));
//freopen("D:\\tsst.txt","w",stdout);
int T, n;
for (scanf("%d", &T); T; T--){
scanf("%d", &n);
while (!que.empty()) que.pop();
for (int i=1; i<=n; i++){
scanf("%d", &nd.v);nd.p=i;
que.push(nd);
}
int num=0;//记录下得到结果的个数
for (int i=0; i<=n; i++) ans[i]=-1;//标记下,防止次优解覆盖最优解
while(!que.empty()){
nd=que.top(); que.pop();
for (int i=n; i>0; i--){
if (nd.p%i==0) continue;
if(ans[i]==-1){
ans[i]=nd.v; num++;
}
}
if(num==n-1){
break;
}
}
for (int i=2; i<=n; i++){
if (i!=2)putchar(' ');
printf("%d", ans[i]);
}
putchar('\n');
}
return 0;
}
很久没写了,这算比较水的题,找找存在感?权当如此吧。。