湖南邀请赛选拔赛

A题:

签到题:

#include<stdio.h>
const double eps=1e-8;
int main(){
	//freopen("in.txt","r",stdin);
	int T;
	double m,h;
	scanf("%d",&T);
	while(T--){
		scanf("%lf%lf",&m,&h);
		double ans=m/(h*h);
		if(ans<18.5-eps){
			printf("Underweight\n");
		}
		else if(ans<23.0-eps){
			printf("Normal\n");
		}
		else{
			printf("Overweight\n");
		}
	}
}
B题:

把两点间距离表示出来,发现是个开口向上的曲线,直接取t=(-b)/(2a),注意定义域t>=0,还有注意a==0的情况

#include<stdio.h>
#include<math.h>
#define sqr(x) ((x)*(x))
const double eps=1e-8;
double dist(double x1,double y1,double x2,double y2){
	return sqrt(sqr(x1-x2)+sqr(y1-y2));
}
int main(){
	//freopen("in.txt","r",stdin);
	int T;
	double x1,x2,y1,y2,vx1,vx2,vy1,vy2;
	scanf("%d",&T);
	while(T--){
		scanf("%lf%lf%lf%lf",&x1,&y1,&vx1,&vy1);
		scanf("%lf%lf%lf%lf",&x2,&y2,&vx2,&vy2);
		double a=sqr(vx1-vx2)+sqr(vy1-vy2);
		double b=2.0*((x1-x2)*(vx1-vx2)+(y1-y2)*(vy1-vy2));
		double t=(-b)/(2.0*a);
		if(t<-eps||fabs(a)<eps) {
			t=0.0;
		}
		printf("%.8f\n",dist(x1+vx1*t,y1+vy1*t,x2+vx2*t,y2+vy2*t));
	}
}
C题:

贪心,从第一棵树开始选起,后面的只要距离小于规定值都砍掉

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define sqr(x) ((x)*(x))
const double eps=1e-8;
int a[100005];
int main(){
	//freopen("in.txt","r",stdin);
	int T;
	int n,d;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&d);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		int post=1;
		int ans=1;
		for(int i=2;i<=n;i++) {
			if(a[i]-a[post]>=d){
				ans++;
				post=i;
			}
		}
		printf("%d\n",ans);
	}
}
D题:

扫描线,把所有端点用一个结构体表示,区间的入点记为1,出点记为-1,当区间被覆盖次数变为0时,统计当前点到入点的数的数量

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define sqr(x) ((x)*(x))
const double eps=1e-8;
struct Node{
	int x,flag;
}a[400005];
int cmp(Node a,Node b){
	if(a.x==b.x) return a.flag>b.flag;
	return a.x<b.x;
}
int main(){
	//freopen("in.txt","r",stdin);
	int T;
	int n,m;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d%d",&a[2*i].x,&a[2*i+1].x);
			a[2*i].flag=1; a[2*i+1].flag=-1;
		}
		scanf("%d",&m);
		for(int i=0;i<m;i++){
			scanf("%d%d",&a[2*n+2*i].x,&a[2*n+2*i+1].x);
			a[2*n+2*i].flag=1; a[2*n+2*i+1].flag=-1;
		}
		int l=2*n+2*m; 
		sort(a,a+l,cmp);
		int cover=0,post=0,ans=0;
		for(int i=0;i<l;i++){
			//printf("%d %d\n",a[i].flag,a[i].x);
			cover+=a[i].flag;
			if(cover==0) {
				ans+=a[i].x-a[post].x+1;
			}
			if(cover==1&&a[i].flag==1){
				post=i;
			}
		}
		printf("%d\n",ans);
	}
}

E题:

当2*A>B时,只能直接加1加至B

当2*A<=B时,问题就转化为了怎么用最小的步数从A到达B/2

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define sqr(x) ((x)*(x))
typedef long long ll;
const double eps=1e-8;
ll ans;
void solve(ll x,ll y){
	if(x*2>y){
		ans+=y-x;
		return;
	}
	else{
		if(y%2==0){
			ans++;
			solve(x,y/2);
		}
		else{
			ans+=2;
			solve(x,y/2);
		}
	}
}
int main(){
	//freopen("in.txt","r",stdin);
	int T;
	int n,m;
	scanf("%d",&T);
	ll x,y;
	while(T--){
		scanf("%lld%lld",&x,&y);
		ans=0;
		solve(x,y);
		printf("%lld\n",ans);
	}
}
F题:

从后看起,当a[i]>a[i+1]时,a[i]以及前面的数都必须进行一次插入,而每次插入的时候,只需要插至对应位置就可以了

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define sqr(x) ((x)*(x))
typedef long long ll;
const double eps=1e-8;
int a[100005];

int main(){
	//freopen("in.txt","r",stdin);
	int T;
	int n,m;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		int ans=1;
		for(int i=n-1;i>=1;i--) {
			if(a[i]<a[i+1]) ans++;
			else break;
		}
		printf("%d\n",n-ans);
	}
}

G题:

用long long就可以了

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define mod 1000000007
typedef long long ll;
const double eps=1e-8;
ll a[1000005];
int main(){
	//freopen("in.txt","r",stdin);
	int T;
	int n,m;
	a[0]=0;a[1]=1;
	for(int i=2;i<=1000000;i++){
		a[i]=(a[i-2]%mod+a[i-1]%mod)%mod;
	}
	scanf("%d",&T);
	int x,y;
	
	while(T--){
		scanf("%d%d",&x,&y);
		ll ans;
		ans=(a[x]%mod*a[y]%mod)%mod;
		printf("%lld\n",ans);
	}
	return 0;
}

H题:

三条直线距离求出来,用海伦公式

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define sqr(x) ((x)*(x))
const double eps=1e-8;
struct Point{
	double x,y,z;
};
double dist(Point a,Point b){
	return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)+sqr(a.z-b.z));
}
int main(){
	//freopen("in.txt","r",stdin);
	int T;
	int n,m;
	scanf("%d",&T);
	int x,y;
	
	while(T--){
		Point p1,p2,p3;
		scanf("%lf%lf%lf",&p1.x,&p1.y,&p1.z);
		scanf("%lf%lf%lf",&p2.x,&p2.y,&p2.z);
		scanf("%lf%lf%lf",&p3.x,&p3.y,&p3.z);
		double a=dist(p1,p2);
		double b=dist(p1,p3);
		double c=dist(p3,p2);
		double p=(a+b+c)/2;
		printf("%lf\n",sqrt(p*(p-a)*(p-b)*(p-c)));
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值