第一道:
搬石头排序
题目:沙滩摆放着一排大小不一的球形石头,已知第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 <iostream> 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 < n; i++) { cin>>r[i];//写入数字 } for (int i = 0; i < n; i++) { r1[i] = r[i];//从原数组中复制第i个数字,以防止原数组在计算过程中被改变 for (int j = i+1; j < n; 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<<n-maxr<<endl; 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
代码:
【问题描述】
兴中道是中山最美丽的道路,路中间的绿化带上种了两列漂亮的大树,这些大树分成了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<iostream> using namespace std; void abc(int a[],int tree[],int N) { for(int i=0;i<50;i++) for(int j=0;j<N;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<N;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<<f<<" "<<x<<endl; return 0; }
全部评论
(5) 回帖