原题链接:
HDU-6098
大意:给一个串,然后生成另一个串,生成规则是(i>=2):
限制没啥特殊的,nlogn算法
思路:
暴力瞎搞即可。
排序 从后往前找 找到就 break
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(s,t) memset(s,t,sizeof(s))
#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
//#define LOCAL
inline void read(int &x){
x=0;char p=getchar();
while(!(p<='9'&&p>='0'))p=getchar();
while(p<='9'&&p>='0')x*=10,x+=p-48,p=getchar();
}
const int MAXN=100000+10;
int a[MAXN],id[MAXN];
bool cmp(int x,int y){return a[x]>a[y];}
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int t;
read(t);
while(t--){
int n;
read(n);
for(int i=1;i<=n;i++){
read(a[i]);
id[i]=i;
}
//sort(id+1,id+n+1,[&](int x,int y){return a[x]>a[y];});
sort(id+1,id+n+1,cmp);
int f=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=n;j++){
if(id[j]%i){
if(f) printf("%d",a[id[j]]),f=0;
else printf(" %d",a[id[j]]);
break;
}
}
}
puts("");
}
return 0;
}
从标程学到两个神奇的东西 一个是 C++11 特性。
sort(id+1,id+n+1,[&](int x,int y){return a[x]>a[y];});
还有一个是神奇的 printf
非行末输出空格,否则换行。学习一个。
printf("%d%c",f," \n"[i==n]);
[i==n] 本身是判断条件 其值为 0 或 1 刚好对应 ” \n” 的下标 映射到 %c 产生奇妙的效果