第七届北京交通大学ACM程序设计竞赛网络预赛二

来源:互联网 发布:js button 文字 编辑:程序博客网 时间:2024/05/15 18:23

没人陪我玩好无聊=.=

让我拿了1,2血.......

都是切了第一套不来第二套了么=.=

A

貌似这个事训练指南上的uva例题改编

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1822

这个是原题

http://blog.csdn.net/ronnoc/article/details/8703650

这个是我的代码

这道题是阉割版

只用考虑时间就好

两个蚂蚁碰来碰去本质没有变,整体是不变的

也就是可以单看蚂蚁而无视其他=.=

然后就是最长最短的计算了

里面的max,min,表示这只蚂蚁是想快走还是慢走

两种都要取max

#include<stdio.h>#include<algorithm>int a[100010];int max(int a,int b){if(a>b)return a;return b;}int min(int a,int b){if(a>b)return b;return a;}int main(){int k,z;scanf("%d",&z);for(k=1;k<=z;k++){int i,n,L;scanf("%d%d",&L,&n);int resa=0,resb=0;for(i=1;i<=n;i++){scanf("%d",&a[i]);resa=max( resa,max(a[i],L-a[i]) );resb=max( resb,min(a[i],L-a[i]) );}printf("Case #%d: %d %d\n",k,resb,resa);}return 0;}


B

这道题目貌似比较坑?

一开始没读懂题目

貌似应该是最小的B而不是B的和=.=

方法是贪心

贪心了2次

先贪B的最小值最大再贪最小的P

或者是贪心最小的P然后看这时候的B是啥

2重结果

贪心证明貌似很不爽?

大概感知下就好

要么B最优,要么P最优...

2Y...

1WA贪了1次

#include<stdio.h>#include<algorithm>int num[110];int b[110][110];int maxb[110],by[110];int p[110][110];int chop[110];int main(){int k,z;scanf("%d",&z);for(k=1;k<=z;k++){int i,j,n;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&num[i]);for(j=1;j<=num[i];j++)scanf("%d%d",&b[i][j],&p[i][j]);maxb[i]=-1;for(j=1;j<=num[i];j++)if(b[i][j]>maxb[i])maxb[i]=b[i][j],by[i]=j;}int x=1,temp=maxb[1];for(i=2;i<=n;i++){if(maxb[i]<temp){temp=maxb[i];x=i;}}for(i=1;i<=n;i++){chop[i]=(int)1e9;for(j=1;j<=num[i];j++)if(b[i][j]>=temp&&p[i][j]<chop[i])chop[i]=p[i][j];}//for(i=1;i<=n;i++)printf("%d ",maxb[i]);printf("maxb\n");//for(i=1;i<=n;i++)printf("%d ",chop[i]);printf("chop\n");int sum=0;for(i=1;i<=n;i++)sum+=chop[i]; double res1=temp/(double)sum;int B=1e9,P=0;for(i=1;i<=n;i++){int tP=p[i][1],tB=b[i][1];for(j=2;j<=num[i];j++)if(tP>p[i][j]){tP=p[i][j];tB=b[i][j];}if(B>tB)B=tB;P+=tP;}double res2=(double)B/P;if(res2>res1)res1=res2;printf("Case #%d: %.3lf\n",k,res1);}return 0;}


C

就是一堆式子相乘

然后格式比较繁琐=.=

注意0 0的trick

3Y

1WA于long long && 0 0

2WA于0 0

#include<stdio.h>#include<math.h>#define LL long longint fi;LL abs(LL x){if(x>0)return x;return -x;} void out(int a,LL b){if(b==0)return;if(!fi){if(b>0)printf("+");else printf("-");}else {fi=0;if(b<0)printf("-");}if(abs(b)!=1)printf("%I64d",abs(b));if(a>=2)printf("x^%d",a);else if(a==1)printf("x");else if(abs(b)==1)printf("%I64d",abs(b));}int main(){int k,z;scanf("%d",&z);for(k=1;k<=z;k++){fi=1;int n,i,j;scanf("%d",&n);LL a[100];for(i=1;i<=50;i++)a[i]=0;scanf("%lld%lld",&a[2],&a[1]);for(i=2;i<=n;i++){int x,y;scanf("%d%d",&x,&y);LL b[100];for(j=1;j<=50;j++)b[j]=0;for(j=2;j<=50;j++)b[j]+=x*a[j-1];for(j=1;j<=50;j++)b[j]+=y*a[j];for(j=1;j<=50;j++)a[j]=b[j];}int max=0;for(i=50;i>=1;i--)if(a[i])break;max=i;printf("Case #%d: ",k);//for(i=max;i>=1;i--)printf("%d ",a[i]);for(i=max;i>=1;i--)out(i-1,a[i]);if(max==0)printf("0");printf("\n");}return 0;}

D

FB题目

就是找规律,一定有循环节

貌似是

0,1,2,0,1,2的简单循环,和n的性质完全一样=.=

#include<stdio.h>int main(){int k,z;scanf("%d",&z);for(k=1;k<=z;k++){int n;scanf("%d",&n);printf("Case #%d: ",k);if(n%3==0)printf("YES\n");else printf("NO\n");}return 0;}


E

一道找规律的题目,按照箭头填数字之后把每个点的结果写出来瞪眼法就好

#include<stdio.h>int main(){int k,z;scanf("%d",&z);for(k=1;k<=z;k++){int x,y;scanf("%d%d",&x,&y);int res=0;if(y>x&&y>=-x){res=4*y-2;}else if(y<-x&&y>=x){x=-x;res=4*x-1;}else if(y>-x+1&&y<=x){res=4*x-3;}else {res=4*(-y);}printf("Case #%d: %d\n",k,res);}return 0;}


F

就是数格子...

数据太小了=.=

有nlgn的算法都懒得写...

就是有l,r两个数组

一个正,一个负,绝对值排序,数每个负的前面有多少正的

排序是Onlgn的

总体就是nlgn

小数据吗=.=

直接n^2的数格子就好=.=

#include<stdio.h>#include<math.h>int map[40][40];int l[40],r[40];//l行r列 int main(){int k,z;scanf("%d",&z);for(k=1;k<=z;k++){int n;scanf("%d",&n);int i,j;for(i=1;i<=2*n;i++)l[i]=0,r[i]=0;for(i=1;i<=n;i++)for(j=1;j<=n;j++){scanf("%d",&map[i][j]);l[i]+=map[i][j];r[j]+=map[i][j]; }int res=0;for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(r[i]>l[j])res++;printf("Case #%d: %d\n",k,res);}return 0;}

G

求出现的所有数字的数字和

水题了=.=

之前做过类似的

2血...

#include<stdio.h>#include<string.h>#define LL unsigned long longchar s[10010];bool is_num(char x){if(x>='0'&&x<='9')return 1;return 0;} int main(){int k,z;scanf("%d%*c",&z);for(k=1;k<=z;k++){int i;gets(s);int len=strlen(s);LL temp=0,res=0;for(i=0;i<=len;i++){if(is_num(s[i])){temp*=10;temp+=s[i]-'0';}else {res+=temp;temp=0;}}printf("Case #%d: %I64u\n",k,res);}return 0;}

H

双基回文数,貌似密度很大?

Matrix67的文貌似说到过?(可能记错...)

直接一个个的验证就好=.=

#include<stdio.h>int is_pal(int x,int oct){int a[50];int pa=0;int y=x,i;for(i=1;i<=49;i++)a[i]=0;while(x>0){pa++;a[pa]+=x%oct;x/=oct;}for(i=1;i<=pa;i++){if(a[i]!=a[pa+1-i])return 0;}return 1;}int is_2pal(int x){int flag=0;int i;for(i=2;i<=10;i++)if(is_pal(x,i))flag++;if(flag>=2)return 1;return 0;}int main(){int k,z;scanf("%d",&z);for(k=1;k<=z;k++){int n,s,i=0;scanf("%d%d",&n,&s);++s;printf("Case #%d:\n",k);while(i<n){if(is_2pal(s))i++,printf("%d\n",s);s++;}}return 0;}


原创粉丝点击