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;
}