描述:
有一个长度为n的整数a,任意选取k个数删除(k<=n)编程求删除后 所的整数最小
eg:a=1324221 k=5 删除后 a=121
#include "stdafx.h"
#include<iostream>
using namespace std;
typedef struct{
int l;//a整数所在位置 最高位为零 以此类推
int v;//各位的数值
}value;//结构体
void paixu(int n,value *&a)//排序 按各位的数值
{
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[j].v <= a[i].v)
{
value temp ;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
void paixu2(int n,value *&a)//按各位数值所在的位置排序
{
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[j].l < a[i].l)
{
value temp ;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int N;
int L;
cin>>N;
cin>>L;
value * p = new value[N];//整数a的各个位存放在里面
value * p1 = new value[N-L];//删除后的整数
for(int i=0;i<N;i++)
{
cin>>p[i].v;
p[i].l=i;
}
paixu(N,p);//排序(从小到大)后 因为要去删除后最小的值 所以排序
for(int i=0;i<N-L;i++)//取前N-L个数 则为删除后最小的N-L个数
{
p1=p;
}
paixu2(N-L,p1);//因为最小数各位的位置是不能变的 所以再把取到的最小数按位置排序
for(int i=0;i<N-L;i++)
{
cout<<p1[i].v;//输出排序后 结构体的各位置
}
return 0;
}
// 上述两个排序算法 的改进 每次循环 只交换一次
void paixu(int n,value *&a)//排序 按各位的数值
{
int k;
value temp;
for(int i=0;i<n;i++)
{
k=i;
for(int j=i+1;j<n;j++)
{
if(a[j].v <= a[i].v)
{
k=j;
}
if(k!=i)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}