JXUFE_上海邀请赛选拔赛

总的说一下这次的情况,这次的状态不太好,期间各种小错误卡好久,freopen()不能用,也是醉了,A题题目描述有问题,就不说了,B题少考虑一种情况,G题把Yes输成YES,I题思路一直有啊,但当时一直混混沌沌的,代码写不出来,J题少写了个break,这么多低级错误,害我卡了好久,还好最后一小时的时候感觉渐渐回来了,一个个的BUG调出来了

比赛的时候卡水题真的是巨影响心情的

链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=76940#overview

HUST 1583:长度单位
A题太坑爹了,必须先转化为英寸,再转化为英尺才行

#include<stdio.h> 
#include<math.h>
const double eps=1e-6; 
int main(){
	int n;
	/*#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif */
	while(scanf("%d",&n)!=EOF){
		double a=n;
		int b=n/3;
		if((n%3)>1) b++;
		printf("%d %d\n",b/12,b%12);
	}
}

HUST 1584 :摆放餐桌

求出每一个小圆要占大圆多少圆心角,连接两圆圆心,过大圆心作小圆切线,求出角度*2即为每个小圆占的角度,然后特判一下r>R的情况

#include<stdio.h> 
#include<math.h>
const double PI=acos(-1.0);
const double eps=1e-8; 
int main(){
	//freopen("in.txt","r",stdin);
	int n;
	double R,r;
	while(scanf("%d%lf%lf",&n,&R,&r)!=EOF){
		double c=R-r;
		double b=r;
		
		int num;
		if(r>R) num=0;
		else if(2*r>R) num=1;
		else if(fabs(2*r-R)<eps) num=2;
		else{
			double q=asin(b/c)*2.0;
			num=floor(2.0*PI/q+eps);
			//printf("%f %f\n",2*PI,q);
		}
		if(n<=num) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

HUST 1583:排队

画下图,即可知求b+1和n-a的较小值

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
	/*#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif*/
	int n,a,b;
	while(scanf("%d%d%d",&n,&a,&b)!=EOF){
		printf("%d\n",min(b+1,n-a));
	}
	return 0;
}

SCU 4424 :Permutations

一开始使劲在按原理求,都没想到直接在找规律,规律很简单的,a[i]=i*a[i-1]+i

然后用long long求模就行了

#include<stdio.h>
#define mod 1000000007
typedef long long ll;
long long a[8000005];
int main(){
	a[0]=0;
	for(int i=1;i<=8000000;i++){
		a[i]=((ll)i*(a[i-1]+1))%mod;
	}
	int t,n;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		printf("%lld\n",a[n]%mod);
	}
}

HUST 1622:小明的三角形

任意两边大于第三边,然后判断一下是不是在一条直线上

#include<stdio.h> 
#include<math.h>
#include<algorithm>
using namespace std;
const double PI=acos(-1.0);
const double eps=1e-8; 
struct Point {
	double x,y;
	Point(){
	}
	Point(double xx,double yy){
		x=xx;y=yy;
	}
	Point operator-(Point b){
		return Point(x-b.x,y-b.y);
	} 
	double operator^(Point b){
		return x*b.y-y*b.x;
	}
};
double dist(double x1,double y1,double x2,double y2){
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main(){
	//freopen("in.txt","r",stdin);
	double x1,x2,x3,y1,y2,y3;
	double R,r;
	int T;
	scanf("%d",&T);
	while(T--){
		
		scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
		Point p=Point(x1,y1);
		Point q=Point(x2,y2);
		Point r=Point(x3,y3);
		double a=dist(x1,y1,x2,y2);
		double b=dist(x1,y1,x3,y3);
		double c=dist(x2,y2,x3,y3);
		if( fabs((p-q)^(r-q))<eps) printf("No\n");
		else{
			if(a+b-eps>c||a+c-eps>b||b+c-eps>a) printf("Yes\n");
			else printf("No\n");
		}
	}
}

辗转数对:

枚举另一个数,然后逆推就可以了

#include<stdio.h> 
#include<algorithm>
using namespace std;
const int inf=999999999;
int n;
int solve(int n,int i){
	if(i==1) return n-1;
	int s=n/i;
	int a=n%i,b=i;
	if(a<1 || b<1) return inf;
	if(a>b) swap(a,b);
	s+=solve(b,a);
	return s;
}
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		int ans=inf;
		if(n==1) ans=0;
		for(int i=1;i<=n/2;i++){
			//if(n%i==0) continue;
			ans=min(solve(n,i),ans);
		}
		printf("%d\n",ans);
	}	
}


HUST 1646:

这里求的是绝对值的最大值,即转化为求最大值和最小值,如果是求绝对值的最小值那就没办法了。。

dp[i]:表示以i结尾的区域的最大值或最小值,则

dp[i]=max(dp[i-1]+a[i],a[i])

dp[i]=main(dp[i-1]+a[i],a[i])

最后从头到尾扫描一遍

#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
//dp[i]:选中第i个数时的最大值 
using namespace std;
struct Node{
	int ma,mi;
}dp[100005];
int a[100005],s[100005];
int main(){
	//freopen("in.txt","r",stdin);
	int n;
	while(scanf("%d",&n)!=EOF){
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		for(int i=1;i<=n;i++) s[i]+=s[i-1];
		dp[1].ma=a[1];
		dp[1].mi=a[1];
		for(int i=2;i<=n;i++) {
			dp[i].ma=max(dp[i-1].ma+a[i],a[i]);
			dp[i].mi=min(dp[i-1].mi+a[i],a[i]);
			//printf("%d ",dp[i].mi);
		}
		int ans=0;
		for(int i=1;i<=n;i++){
			ans=max(ans,abs(dp[i].ma));
			ans=max(ans,abs(dp[i].mi));
		}
		printf("%d\n",ans);
	}
	return 0;
}

SCU 4416:Happy hkw

按价格从小到大排个序,则第i个价格必经前面的都大,这时只需要比较第i个的质量是否比前面质量的最大值小即可

#include<stdio.h>
#include<algorithm>
using namespace std;
struct Node{
	int p,q;
}a[100005];
int cmp(Node a,Node b){
	return a.p<b.p;
}
int main(){
	//freopen("in.txt","r",stdin);
	int n;
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++) scanf("%d%d",&a[i].p,&a[i].q);
		sort(a,a+n,cmp);
		int ma=a[0].q,flag=1;
		for(int i=1;i<n;i++){
			if(a[i].q<ma) {
				flag=0;
				printf("Happy xkw\n");
				break;
			}
			ma=max(ma,a[i].q);
		}
		if(flag) printf("Poor xkw\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值