B - 线段的包含关系
题目大意:
给定一个序列a1,a2,…an,一个编号为1到n的一维判断,要求找到两个不同的索引i和j,使ai位于aj内。[l1,r1]位于[l2,r2]内,前提是 l1 ≥ l2, r1 ≤ r2。要求打印索引i和j。如果有多个答案,打印其中任何一个即可。如果没有答案,打印-1 -1。
解题思路:
直接开一个结构体数组,里面存储区间的左边界和右边界以及区间的序列号。然后对区间进行排序(比赛的时候就是因为排序方法不正确。。题没做出来)即:左边界小的在前面,若左边界相等则右边界大的在前面。然后从头遍历,因为左边界小的在前面,所以在比较时不用管左边界的事了,因为已经有序了,然后只需要比较当前区间的右边界和下一个区间的,右边界就行了。如果当前区间的右边界大于下一个区间的右边界,则下一个区间在当前区间内。然后输出对应的序列号即可。(感觉最重要的还是区间的排序还是太菜了 )
正式题解:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6;
typedef long long ll;
int n; //区间的数量
int i,j,k; //控制循环
struct node
{
ll l; //左端点的坐标
ll r; //右端点的坐标
int num; //区间的编号
}s[maxn];
int cmp(node a,node b)
{
if(a.l==b.l)
return a.r>b.r;
return a.l<b.l;
}
int main()
{
cin>>n;
for(i=1;i<=n;i++)
{
s[i].num=i;
cin>>s[i].l>>s[i].r;
}
sort(s+1,s+1+n,cmp);
for(i=1;i+1<=n;i++)
{
if(s[i].r>=s[i+1].r)
{
cout<<s[i+1].num<<" "<<s[i].num<<endl;
return 0;
}
}
cout<<-1<<" "<<-1<<endl;
return 0;
}
C - 地下城还有劳拉
题目大意:
给定一个迷宫的行数和列数以及劳拉行走过的次数,让求出劳拉当前的位置。(劳拉先从左上角出发一直行走到左下角)然后一直向右走到边界处,再向上走一格再向左走到第二列再向上走一格再向右走到边界再向上走一格…如此蛇形走位,到达(1,2)处时停止行动。
解题思路:
在第一列中,从左边的示意图可以看出k<n时坐标就是(k+1,1)。
其余的则按照右边的示意图进行处理,首先k-=n;可以发现所在方格的行为n-k/(m-1)。
当所在行为偶数时,列就是k%(m-1)+2,否则是m-k%(m-1)。
正式题解:
#include<iostream>
using namespace std;
typedef long long ll;
ll n,m,k;
ll r,l; //行和列
int main()
{
cin>>n>>m>>k;
if(k<n)
cout<<k+1<<" "<<1<<endl;
else
{
k-=n;
r=k/(m-1);
if(r%2!=0)
l=m-k%(m-1);
else
l=k%(m-1)+2;
cout<<n-r<<" "<<l<<endl;
}
return 0;
}
(get到一个判断奇偶性的新方法:n&1;当结果为1时说明n是奇数,否则是偶数)