浪潮编程题python石头排序_浪潮两道编程题 网上有原题 不会改成java,哎

第一道:

搬石头排序 题目:

沙滩摆放着一排大小不一的球形石头,已知第i个石头的半径为ri,不存在两个石头半径相等。现要求通过移动石头使摆放的石头从左往右半径递增。每次可选择一块石头,并把它放在剩下n-1块石头的最左边或最右边。求最少操作次数。

输入:

第一行一个整数n,表示石头个数。(1 <= n <= 100000).第二行n个整数,表示从左往右石头的半径r1,r2,…,rn( 1<= ri <= n)。保证不存在两个不同的石头半径相等。

输出:

最少操作次数。

样例输入

6

3 2 1 4 6 5

样例输出

3

分析

保持原序列中最大递增1的子序列(样例中3 4 5)不变,移动其他石头。那么只需求出最大递增1的子序列长度,再用总长度减去子序列长度,即为需移动数目。

代码

#include 

using namespace std ;

int main()

{

int n, num = 1, maxr = 1;

cin>>n;

int *r = new int[n];//创建长为n的数组

int *r1 = new int[n];//备用数组

for (int i = 0; i 

{

cin>>r[i];//写入数字

}

for (int i = 0; i 

{

r1[i] = r[i];//从原数组中复制第i个数字,以防止原数组在计算过程中被改变

for (int j = i+1; j 

{

r1[j] = r[j];//从原数组中复制第j个数字

if (r1[i]+1 == r1[j])//判断相邻两数字是否递增1

{

num = num + 1;//递增1子序列的长度

r1[i] = r1[j];

}

}

if (num > maxr)//更新递增1子序列的长度

{

maxr = num;

}

num = 1;

}

cout<

system("PAUSE");

}

第二道

题目描述

【问题描述】

兴中道是中山最美丽的道路,路中间的绿化带上种了两列漂亮的大树,这些大树分成了50行,每行两棵大树,一共100棵大树,这些大树被编上了号,编号方式如下:

1 3 5 7 ………… 95 97 99

2 4 6 8 ………… 96 98 100

再过几天奥运火炬就要在中山传递了,美丽的兴中道当然是最重要的必经之路,但是某天晚上却发生了一件令人震惊的大事--可恶的破坏分子为了破坏奥运,让中山人民丢丑,竟然偷去了这100棵大树中的一部分!

公安部门马上出动,列出了被偷去了大树的编号。现在摆在我们面前的情况是,如果火炬的旁边是空空的树坑,那是令人无法接受的,因此我们只能压缩火炬在兴中道上的传递距离,务必使火炬在连续的大树边传递,当时,我们就得找出一列最长的连续的大树供传递火炬时展现在全世界的人面前。请你编写程序解决这一难题。

输入

【输入格式】

N (表示有N棵大树被盗)

N1 N2 N3……NN (被盗大树的编号)

输出

【输出格式】

M X (表示从第M棵大树开始,共有连续的X棵大树,如果有多个解,只输出一个解即可)

样例输入

59 15 27 35 6

样例输出

8 47

代码:

#include

using namespace std;

void abc(int a[],int tree[],int N)

{

for(int i=0;i<50;i++)

for(int j=0;j

if(a[i]==tree[j])

a[i]=0;

}

void def(int a[],int &y,int &x,int &f)

{

for(int i=0;i<51;i++)

{

if(a[i]!=0)

y++;

else

{

if(y>x)

{

x=y;

f=a[i-x];

}

y=0;

}

}

}

int main()

{

int N,tree[100],i,j=0,k=0,a[51]={0},b[51]={0};

int x=0,y=0,f;

cin>>N;

for(i=0;i

cin>>tree[i];

for(i=1;i<=100;i++)

{

if(i%2!=0)

{

a[j]=i;

j++;

}

else

{

b[k]=i;

k++;

}

}

abc(a,tree,N);

abc(b,tree,N);

def(a,y,x,f);

def(b,y,x,f);

cout<

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值