逆序数还原c语言 输入数组 2 0 1 0 0 输出原序数 3 1 4 2 5
答案:4 悬赏:30
解决时间 2021-02-04 02:38
- 提问者网友:逐野
- 2021-02-03 15:40
逆序数还原c语言 输入数组 2 0 1 0 0 输出原序数 3 1 4 2 5
最佳答案
- 二级知识专家网友:何必打扰
- 2021-02-03 17:07
#include "stdafx.h"
#include
#include
#include
#include
#include
int c[1001],a[1200];
int n;
int low(int x)
{
return x&(-x);
}
int sum(int x)
{
int cnt=0;
while(x>0)
{
cnt+=c[x];
x-=low(x);
}
return cnt;
}
void add(int x,int num)
{
while(x<=n)
{
c[x]+=num;
x+=low(x);
}
}
int main()
{
int num;
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
add(i,1);
for(int i=1;i<=n;i++)
{
scanf("%d",&num);
num++;
for(int j=1;j<=n;j++)
if(sum(j)==num)
{
a[i]=j;
add(j,-1);
break;
}
}
for(int i=1;i<=n;i++)
{
if(i!=1)
printf(" ");
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}
#include
#include
#include
#include
#include
int c[1001],a[1200];
int n;
int low(int x)
{
return x&(-x);
}
int sum(int x)
{
int cnt=0;
while(x>0)
{
cnt+=c[x];
x-=low(x);
}
return cnt;
}
void add(int x,int num)
{
while(x<=n)
{
c[x]+=num;
x+=low(x);
}
}
int main()
{
int num;
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
add(i,1);
for(int i=1;i<=n;i++)
{
scanf("%d",&num);
num++;
for(int j=1;j<=n;j++)
if(sum(j)==num)
{
a[i]=j;
add(j,-1);
break;
}
}
for(int i=1;i<=n;i++)
{
if(i!=1)
printf(" ");
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}
全部回答
- 1楼网友:請叫我丶偏執狂
- 2021-02-03 19:35
我没懂什么意思,能具体一点吗?
- 2楼网友:星星坠落
- 2021-02-03 18:58
本题的逆序数就是后面比它小的数
那么从前往后看
第一个的数的逆序数是a1
表示后面有a1个比其小
因为前面又没有数
所以它是第a1+1大的数,也就是a1+1
对于第二个数a2,表示第二个数是后面第a2+1小的
如果a2+1大于第一个数,要是后面有a2个比当前数小,那么就要是a2+2了
第三个第四个以此类推
对于数列数很小的时候,可以从左到右每次都选择没出现过的第ai+1大的数
#include
#include
#define MAXN 5000
int vis[MAXN];
int a[MAXN];
int res[MAXN];
int main(){
int n,i,j,k;
printf("请输入数的个数n:");
scanf("%d",&n);
printf("请输入n个数:\n");
for(i=0;i
#define MAXN 100000
int a[MAXN];
int res[MAXN];
typedef struct{
int sum;
int left,right;
}Node;
Node tree[MAXN<<2];//开4倍空间
void build(int id,int left,int right){
tree[id].left=left;
tree[id].right=right;
if(left==right){
tree[id].sum=1;
return;
}
int mid=(left+right)>>1;
build(id<<1,left,mid);
build(id<<1|1,mid+1,right);
tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;
}
void update(int id,int pos,int val){
int left=tree[id].left;
int right=tree[id].right;
if(left==right){
tree[id].sum=0;
return;
}
int mid=(left+right)>>1;
if(pos<=mid) update(id<<1,pos,val);
else update(id<<1|1,pos,val);
tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;
}
int query(int id,int val){
int left=tree[id].left;
int right=tree[id].right;
if(left==right) return left;
if(tree[id<<1].sum
- 3楼网友:萌萌哒小可爱
- 2021-02-03 17:59
main()
{int a[5],i;
for(i=0;i<5;i++)
scanf("%d",&a[i]);
for(i=4;i>=0;i--)
printf("%d ",a[i]);
getch();
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |