1002:
题意:
给n个区间,需要依次走完这些区间,注意是依次,一开始没看见我也忽略了
题解:
找到每次移动的最左位置和最右位置,判断要到达的区间和目前左右位置的关系。
样例举例:
最开始最左是0,最右是1000000,ans=0,因为可以在这个区间随意放置
添加第一个区间【1,10】,发现这个区间和目前区间有交,ans不需要更新操作,此时只需要更新区间为【1,10】
添加第二个区间【20,30】,和目前区间无交集,更新ans,并更新区间为【20,20】
为什么要更新成【20,20】?因为你执行完最小步数且在目标区间类的最终坐标只能是20.当然如果最终区间是【19,30】,你更新的新区间就是【19,20】
代码奉上吧。。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1001;
struct road{
int l,r;
bool operator<(const road& a)const {
if(l!=a.l)return l<a.l;
return r<a.r;
}
}r[maxn];
int ans;
int n;
void dfs(int i,int lp,int rp){
if(i==n+1)return;
if(r[i].l<=lp&&r[i].r>=lp||r[i].l<=rp&&r[i].r>=rp||r[i].l>=lp&&r[i].l<=rp||r[i].r>=lp&&r[i].r<=rp){
//上面这个if有点长就是两个区间有交集的意思
//更新区间,不更新ans
lp=max(lp,r[i].l);
rp=min(rp,r[i].r);
dfs(i+1,lp,rp);
}
else{
//无交集,更新ans,更新区间
int lasp=r[i].l>rp?r[i].l:r[i].r;
int len=min(abs(r[i].l-rp),abs(r[i].r-lp));
ans+=len-len/2;
if(!(len&1))dfs(i+1,lasp,lasp);
else{
if(r[i].l!=r[i].r){
if(r[i].l>rp)dfs(i+1,lasp,lasp+1);
else dfs(i+1,lasp-1,lasp);
}
else dfs(i+1,lasp,lasp);
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&r[i].l,&r[i].r);
}
ans=0;
int lp=0,rp=1000000;
dfs(1,lp,rp);
printf("%d\n",ans);
}
return 0;
}
5题就一个找规律题打个表就行了
规律是每六个数一个式子
scanf("%lld",&n);
ll x=ceil(1.0*n/6);
n%=6;
if(n==0){
printf("%lld\n",3*x);
}
else if(n==1){
printf("%lld\n",4*x-3);
}
else if(n==2){
printf("%lld\n",3*x-2);
}
else if(n==3){
printf("%lld\n",x-1);
}
else if(n==4){
printf("%lld\n",6*x-3);
}
else if(n==5){
printf("%lld\n",x-1);
}