C语言NOIP2008复赛普及组第二题最后一个数据就是过不去 程序如下

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言NOIP2008复赛普及组第二题最后一个数据就是过不去 程序如下相关的知识,希望对你有一定的参考价值。

#include<stdio.h> #include<stdlib.h> int main() FILE *in,*out; in=fopen("seat.in","r"); out=fopen("seat.out","w"); int m,n,k,l,d; int h[1000]=,z[1000]=,h1[100000]=,z1[100000]=,h2[10000],z2[10000]; int x,y,p,q; int i,j1=0,j2=0,j,ch=0,cz=0,tmp; int max=0; fscanf(in,"%d %d %d %d %d",&m,&n,&k,&l,&d); for(i=0;i<d;i++) fscanf(in,"%d %d %d %d",&x,&y,&p,&q); if(x==p) if(y>q) z[j1]=q; else z[j1]=y; j1++; if(y==q) if(x>p) h[j2]=p; else h[j2]=x; j2++; for(i=0;i<j1;i++) z1[z[i]]+=1; for(i=0;i<j2;i++) h1[h[i]]+=1; for(i=0;i<k;i++) max=0; for(j=0;j<10000;j++) if(h1[j]>max) max=h1[j]; x=j; h1[x]=0; h2[ch]=x; ch++; for(i=0;i<l;i++) max=0; for(j=0;j<10000;j++) if(z1[j]>max) max=z1[j]; x=j; z1[x]=0; z2[cz]=x; cz++; for(i=0;i<ch;i++) for(j=1;j<=ch;j++) if(h2[j-1]>h2[j]) tmp=h2[j-1]; h2[j-1]=h2[j]; h2[j]=tmp; for(i=0;i<cz;i++) for(j=1;j<=cz;j++) if(z2[j-1]>z2[j]) tmp=z2[j-1]; z2[j-1]=z2[j]; z2[j]=tmp; for(i=1;i<=ch;i++) if(i==ch) fprintf(out,"%d",h2[i]); else fprintf(out,"%d ",h2[i]); fprintf(out,"\n"); for(i=1;i<=cz;i++) if(i==cz) fprintf(out,"%d",z2[i]); else fprintf(out,"%d ",z2[i]); fclose(in); fclose(out); return 0;

参考技术A 这道题数据量很少,穷举为O(2)算法,所以穷举就可以了,核心部分:
(先在图上标明有交头接耳人的序号坐标)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]!=0)

就找右边或后边;划出一行,

这样穷举,看哪个方案最好。
你的方法可能到最后超时

以上是关于C语言NOIP2008复赛普及组第二题最后一个数据就是过不去 程序如下的主要内容,如果未能解决你的问题,请参考以下文章

排座椅(NOIP2008 普及组第二题)

关于NOI2008普及组C语言复赛的一道题

表达式求值(NOIP2013 普及组第二题)

回文日期(NOIP2016 普及组第二题)

帮我看看这个程序,NOIP2010普及组第二题。

纪念品分组(Noip2007 普及组第二题)