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

没人陪我玩好无聊=.=

让我拿了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 long
int 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 long
char 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;
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值