导弹防御系统我原来的要以CTRL+Z结束输入,而且还要多输入一个数字现在红色部分用了crackerwang的果真好用
#include "stdio.h"
int main()
{
int max,fa=0,sum,n=0,m,i=0,j,p,pz,k,d[20][2]={0,0},wz[20]; //d[i][0]=20个高度d[i][1]=到当前的数目 wz[顺序号]
// while(EOF!=scanf("%d",&d[n][0]) && n<20)
// d[n++][1]=0;
// n--;
while(j=getchar())
if(j==' ') n++;
else if(j==10) break;
else d[n][0]=d[n][0]*10+(j-'0');
for(i=0;i<=n;i++) //从20个数的开头开始
{
if(d[i][0]==0) continue; //如果当前处是0就代表已经被筛选出来
sum=0; //sum当前个数
fa++; //fa=方案
p=k=0; //k的增长代表递减个数的增长p代表要排除的数
wz[0]=i; //当前方案头一个,存放的是d[]的下标
for(j=i+1;j<=n;j++)
{
if(j<pz && d[j][0]>p && d[j][0]<d[wz[k]][0]) //此处比当前纪录处小且要大与要排除的数
{
if(k>=d[j][1]) //如果当前顺序个数大于比此处纪录的个数,说明可以继续
{
k++; //k纪录着当前顺序的个数
wz[k]=j; //wz[k]纪录着此处的高度数所处数列的下标
d[j][1]=k; //d[j][1]纪录着当前高度在顺序中的位置
}
else j=n;
}
else if(j>pz && d[j][0]>0 && d[j][0]<d[wz[k]][0])
{
if(k>=d[j][1]) //如果当前顺序个数大于比此处纪录的个数,说明可以继续
{
k++; //k纪录着当前顺序的个数
wz[k]=j; //wz[k]纪录着此处的高度数所处数列的下标
d[j][1]=k; //d[j][1]纪录着当前高度在顺序中的位置
}
else j=n;
}
if(j==n) //本次查找到最后一个
{
if(k>sum) sum=k; //纪录本次最多个数
if(k>0) //如果k>0
{
pz=wz[k]; //要排除数的坐标
p=d[pz][0]; //要排除的数
k--; //返回一个找比要排除数大且比返回一个的数小
j=wz[k];
}
else //如果k=0说明本次查找结束
{
if(sum>max) max=sum; //如果本次长度大于max,纪录下本次的
for(k=n,m=sum;k>=0;k--) //从后往前,把筛选出最长的顺序中的高度数找到清0
{
if(d[k][0]>0)
if(d[k][1]==m && m>=0)
{
d[k][0]=0; //把筛选出的最多的高度数都清0
m--;
}
else d[k][1]=0; //把此处标记的个数清0
}
}
}
}
}
printf("%d %d\n",max+1,fa);
return 0;
}
#include "stdio.h"
int main()
{
int max,fa=0,sum,n=0,m,i=0,j,p,pz,k,d[20][2]={0,0},wz[20]; //d[i][0]=20个高度d[i][1]=到当前的数目 wz[顺序号]
// while(EOF!=scanf("%d",&d[n][0]) && n<20)
// d[n++][1]=0;
// n--;
while(j=getchar())
if(j==' ') n++;
else if(j==10) break;
else d[n][0]=d[n][0]*10+(j-'0');
for(i=0;i<=n;i++) //从20个数的开头开始
{
if(d[i][0]==0) continue; //如果当前处是0就代表已经被筛选出来
sum=0; //sum当前个数
fa++; //fa=方案
p=k=0; //k的增长代表递减个数的增长p代表要排除的数
wz[0]=i; //当前方案头一个,存放的是d[]的下标
for(j=i+1;j<=n;j++)
{
if(j<pz && d[j][0]>p && d[j][0]<d[wz[k]][0]) //此处比当前纪录处小且要大与要排除的数
{
if(k>=d[j][1]) //如果当前顺序个数大于比此处纪录的个数,说明可以继续
{
k++; //k纪录着当前顺序的个数
wz[k]=j; //wz[k]纪录着此处的高度数所处数列的下标
d[j][1]=k; //d[j][1]纪录着当前高度在顺序中的位置
}
else j=n;
}
else if(j>pz && d[j][0]>0 && d[j][0]<d[wz[k]][0])
{
if(k>=d[j][1]) //如果当前顺序个数大于比此处纪录的个数,说明可以继续
{
k++; //k纪录着当前顺序的个数
wz[k]=j; //wz[k]纪录着此处的高度数所处数列的下标
d[j][1]=k; //d[j][1]纪录着当前高度在顺序中的位置
}
else j=n;
}
if(j==n) //本次查找到最后一个
{
if(k>sum) sum=k; //纪录本次最多个数
if(k>0) //如果k>0
{
pz=wz[k]; //要排除数的坐标
p=d[pz][0]; //要排除的数
k--; //返回一个找比要排除数大且比返回一个的数小
j=wz[k];
}
else //如果k=0说明本次查找结束
{
if(sum>max) max=sum; //如果本次长度大于max,纪录下本次的
for(k=n,m=sum;k>=0;k--) //从后往前,把筛选出最长的顺序中的高度数找到清0
{
if(d[k][0]>0)
if(d[k][1]==m && m>=0)
{
d[k][0]=0; //把筛选出的最多的高度数都清0
m--;
}
else d[k][1]=0; //把此处标记的个数清0
}
}
}
}
}
printf("%d %d\n",max+1,fa);
return 0;
}
[此贴子已经被作者于2007-4-20 5:03:03编辑过]
英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!