https://codeforces.com/contest/1082/problem/A
难度系数才1200的题,其实确实不难,就是有点繁琐,以为第一题没这么复杂呢
结果做了一个多小时。。。今晚状态真的laji啊
思路:先看是否可以直接从x->y,如果可以这一定是最短路,直接输出就行
否则判断是否可以从1->y和从n->y,如果可以再计算最短路径,否则输出-1
坑点:没说x一定小于y,所以我这个思路肯定想复杂了,至于快一点的方法怎么做现在脑子炸了想不出来
我只能将错就错把y<x的情况对称成了x<y的情况,其实也容易,不过这才是*1200的题啊
难受
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
#define mod 1000000007
#define inf 0x3f3f3f3f
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t --)
{
int x, y, n, d;
ll len1 = 0, len2 = 0, len3 = 0, len4 = 0;
bool flag1 = 1, flag2 = 1;
scanf("%d%d%d%d",&n,&x,&y,&d);
if(x > y)
{
x = n - x + 1;
y = n - y + 1;
}
len3 = (x - 1) / d + (((x-1) % d) != 0);
len4 = (n - x) / d + (((n-x) % d) != 0);
if((y - x) % d == 0) printf("%d\n",(y - x) / d);
else
{
if((n - y) % d == 0)
{
len1 = (n - y) / d;
}
else
{
flag1 = 0;
len4 = inf;
}
if((y - 1) % d == 0)
{
len2 = (y - 1) / d;
}
else
{
flag2 = 0;
len3 = inf;
}
//cout<<len1<<' '<<len2<<' '<<len3<<' '<<len4<<endl;
if(! flag1 && ! flag2)
{
printf("-1\n");
}
else
{
ll k1 = len2 + len3;
ll k2 = len1 + len4;
//cout<<'*'<<endl;
printf("%I64d\n",min(k1, k2));
}
}
}
return 0;
}