凉心的比赛(一)

B 线段的包含关系

这题我看很像之前贪心专项里的一个题,我自己独立做出来了,比赛时没看

先用结构体存储数据,用sort对l排序,再用个栈判断r是否符合。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn=3e5+10;
int n;
bool ok;
struct node{
	ll l,r;
	int id; 
}s[maxn];
stack<node>q;
bool cmp(const node &a,const node &b){
	if(a.l==b.l)
	return  a.r>b.r;
	return a.l<b.l;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld %lld",&s[i].l,&s[i].r);
		s[i].id=i;
	}
	sort(s+1,s+1+n,cmp);
	for(int i=1;i<=n;i++){
		if(q.empty()){
			q.push(s[i]);
		}
		else{
			if(q.top().r<s[i].r)
			q.pop(); 
		q.push(s[i]);
		}
	if(q.size()>=2){
		ok=true;
		break;
	}
}
if(ok==true){
	printf("%d ",q.top().id);
	q.pop();
	printf("%d\n",q.top().id);
}
else{
	cout<<"-1 "<<"-1"<<endl;
}
return 0;
}

C 地下城还有劳拉

这道题我做的很费劲,一开始我读的题意就有问题,以为是左移下,右移下,而题意是移一层。
然后一开始用Dfs,后来模拟,再后来自己找的规律都没做出来

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k;
int  main(){
	scanf("%lld%lld%lld",&n,&m,&k);
	if(k>=n*m-1)
		printf("1 2\n");
	else if(!k)
	printf("1 1\n");
	else if(k<=n-1&&k)
	printf("%lld 1\n",k+1);
	else{
		k-=(n-1);
		ll b=k%(m-1);//每层第几个 
		k/=(m-1);//第几层 
		if(b==0){// 
			if(k%2==0)//偶数层 
				printf("%lld 2\n",n-k+1);
			else
			    printf("%lld %lld\n",n-k+1,m);
		}
		else{
			if(k%2==0) //偶数层 
			    printf("%lld %lld\n",n-k,b+1);
			else 
			    printf("%lld %lld\n",n-k,m-b+1); 
		}
	}
	return 0;
}

G 法法非法是朋友

这道题题意很难理解
最主要的是让小圆尽量占大圆更大的面积,而且不能占全部面积。
补一下sqrt:
sqrt使用时大多需要要强制类型转化,因为sqrt只支持double和float类型,
可以这样
c=(int) sqrt((double)aa+bb);或者c=(int) sqrt((float)aa+bb);
最难想的是如何最大化
还用到了三角形相似

#include<bits/stdc++.h>
using namespace std; 
double r,x1,y1_,x2,y2;
double d;
double solve(double x1,double y1_,double x2,double y2){
	return sqrt((y2-y1_)*(y2-y1_)+(x2-x1)*(x2-x1));
}
int main(){
	cin>>r>>x1>>y1_>>x2>>y2;
	d=solve(x1,y1_,x2,y2);
	if(d>=r){
		printf("%.1lf %.1lf %.1lf\n",x1,y1_,r);
		return 0;
	}
	if(d==0){
		printf("%.16lf %.16lf %.16lf\n",x1+r/2,y1_,r/2);
		return 0;
	}
//	printf("%.16lf\n",d);
	double x=x2-(x2-x1)/d*((d+r)/2);
	double y=y2-(y2-y1_)/d*((d+r)/2);
	printf("%.16lf %.16lf %.16lf\n",x,y,(d+r)/2); 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值