2020HDU多校第八场

  |  

Clockwise or Counterclockwise (HDU-6857)(1003)

题意:给定三个点的坐标,A,B,C,判断从A到B到C是顺时针还是逆时针。

思路:这道题的话,右手定则。向量αx向量β,若β在α的逆时针方向,则为正值;顺时针则为负值顺时针则为负值;两向量共线则为0。

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <bits/stdc++.h>
typedef long long ll;
const int maxn = 100010;
const int inf = 0x3f3f3f3f;
#define P pair<double, double>
#define x first
#define y second
using namespace std;
P V[5];
P s[5];
double Cross(P a, P b)
{
return a.x * b.y - a.y * b.x;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--)
{
for (int i = 0; i < 3; i++)
cin >> V[i].x >> V[i].y;
for (int i = 0; i < 2; i++)
s[i] = {V[i + 1].x - V[i].x, V[i + 1].y - V[i].y};
bool z = true;
if (Cross(s[0], s[1]) > 0)
z = false;

if (z)
cout << "Clockwise" << endl;
else
cout << "Counterclockwise" << endl;
}
return 0;
}

Fluctuation Limit (HDU-6860)(1006)

题意:给你n个范围$[li,ri]$和一个整数x,要求构建一个长度为n的数组ai,要求保证$ai >= li$ && $ai <= ri$,并且保证相邻两个x之间的差值的绝对值不大于x。

思路:这道题的话,正着对区间约束过后还得倒着将每个区间缩一遍。这样最终随便从每段可行区间里任意取一个值即可。其中$up[i]$表示第i天能预测的最大值,$down[i]$同理,因为可能存在类似第i天的$down[i]$加上k后还到不了第$i+1$天的下界,所以最后得倒着根据第$i+1$天的$down[i]$减掉k来更新第i天的$down[i]$。

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <bits/stdc++.h>
typedef long long ll;
const int maxn = 100010;
const int inf = 0x3f3f3f3f;
using namespace std;
int l[maxn], r[maxn], up[maxn], down[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--)
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> l[i] >> r[i];
up[1] = r[1];
down[1] = l[1];
bool flag = true;
for (int i = 2; i <= n; i++)
{
up[i] = min(r[i], up[i - 1] + k);
down[i] = max(l[i], down[i - 1] - k);
if (up[i] < down[i])
flag = false;
}
for (int i = n - 1; i >= 1; i--)
{
up[i] = min(up[i], up[i + 1] + k);
down[i] = max(down[i], down[i + 1] - k);
if (up[i] < down[i])
flag = false;
}
if (!flag)
cout << "NO" << endl;
else
{
cout << "YES" << endl;
for (int i = 1; i <= n; i++)
{
cout << down[i] << ' ';
}
cout << endl;
}
}
return 0;
}

Hexagon (HDU-6862)(1008)

题意:如图所示,有一个半径为n的六边形网络,你应该从中间开始经过每一个网格,问你路线。

思路:这道题的话,https://blog.csdn.net/Sankkl1/article/details/107991889

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <bits/stdc++.h>
typedef long long ll;
const int maxn = 100010;
const int inf = 0x3f3f3f3f;
using namespace std;
int t, n;
void solveji()
{
for (int k = n - 2; k >= 1; k -= 2)
{
int a = 4, b = 2;
printf("3");
for (int t = 1; t <= 5; t++)
{
for (int i = 1; i <= k; i++)
printf("%d%d", a, b);
printf("%d", a);
a++, b++;
if (a > 6)
a = 1;
if (b > 6)
b = 1;
}
printf("%d", a);
for (int i = 1; i <= k - 1; i++)
printf("%d%d", b, a);
printf("4");
}
printf("\n");
}

void solveou()
{
for (int k = n - 1; k >= 1; k -= 2)
{
int a = 4, b = 2;
printf("3");
for (int t = 1; t <= 5; t++)
{
if (t == 5 && k == 1)
break;
printf("%d", a);
for (int i = 1; i <= k - 1; i++)
printf("%d%d", b, a);
a++, b++;
if (a > 6)
a = 1;
if (b > 6)
b = 1;
}
if (k != 1)
{
printf("%d", a);
for (int i = 1; i <= k - 2; i++)
printf("%d%d", b, a);
}
if (k == 1)
printf("3");
else
printf("4");
}
printf("\n");
}

int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
if (n % 2)
solveji();
else
solveou();
}
return 0;
}

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. Clockwise or Counterclockwise (HDU-6857)(1003)
  2. 2. Fluctuation Limit (HDU-6860)(1006)
  3. 3. Hexagon (HDU-6862)(1008)
,
字数统计:87.6k 载入天数...载入时分秒...