当前位置: 代码迷 >> C语言 >> ACM题集(即时更新)
  详细解决方案

ACM题集(即时更新)

热度:272   发布时间:2007-04-20 04:20:43.0
导弹防御系统我原来的要以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;
}

[此贴子已经被作者于2007-4-20 5:03:03编辑过]


----------------解决方案--------------------------------------------------------
30和31楼时间不够
----------------解决方案--------------------------------------------------------
这里的题目是哪个网站上的啊,应该不是北大的ACM网站
----------------解决方案--------------------------------------------------------
我在我们学校上的OJ上找的,有几百个
----------------解决方案--------------------------------------------------------
高精度去位留最小数
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
struct str
{
char s[240];
int k;
struct str *next;
}*head,*p,*d;
int n,m,i=1,j;
while(i)
{
p=(struct str*)malloc(sizeof(struct str));
if(scanf("%s",p->s)==EOF)break;
if(scanf("%d",&p->k)==EOF)break;
if(p->k > strlen(p->s))
{
free(p);
continue;
}
else if(p->k==strlen(p->s))
p->k=-1;
if(i==1)
{
head=d=p;
i++;
}
d->next=p;
p->next=0;
d=p;
}
while(head)
{
if(head->k==-1)
{
printf("0\n");
head=head->next;
continue;
}
m=strlen(head->s);
if(m==1)
{
printf("%c",head->k==0 ? head->s[0] : '0');
head=head->next;
continue;
}
n=1;
for(i=0;head->k && n<m;)
{
if(head->s[i]=='0' || head->s[i]=='-')
{
i++;
if(i==n)n++;
continue;
}
if(head->s[i]>head->s[n])
{
head->s[i]='-';
head->k--;
if(head->k==0)break;
if(i==0)
{
i++;
if(i==n)n++;
}
else
{
j=i;
while(head->s[i]=='-' && i>0)i--;
for(n=i+1;head->s[n]=='-';n++);
}
}
else if(head->s[n]>head->s[i])
{
if(head->k==1)
{
head->s[n]='-';
head->k--;
break;
}
if(n!=m-1)i=n;
if(n<m-1)n++;
else break;
}
else
if(n<m-1)n++;
else if(i==n && n==m-1)break;
}
m=m-head->k;
for(i=0;m--;i++)
if(head->s[i]!='-')printf("%c",head->s[i]);
head=head->next;
printf("\n");
}
return 0;
}

[此贴子已经被作者于2007-4-22 0:50:48编辑过]


----------------解决方案--------------------------------------------------------
LZ我想和你说你一下 做ACM关键不是程序,而是思想,我想你写上自己的思想原比写上自己的程序能让大家明白的更快
----------------解决方案--------------------------------------------------------
我发这些是给大家自己锻炼的,不是告诉大家怎么做那两个题目的答案是最开始发上去的,我以后不发了,只是觉得比较简单就发了
----------------解决方案--------------------------------------------------------

看明白别人的代码就明白了别人的思想


----------------解决方案--------------------------------------------------------

...

[此贴子已经被作者于2007-4-20 17:42:51编辑过]


----------------解决方案--------------------------------------------------------
回复:(我不是郭靖)支持!!!!!
谢谢分享
----------------解决方案--------------------------------------------------------
  相关解决方案