A . Maximum Multiple
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6298
- n = x + y + z; 设 n = ax = by = cz,则1/a + 1/b + 1/c = 1,可以推出当n % 3 == 0 和当 n % 4 == 0时成立,这时a,b,c分别为3,3,3和2,4,4 。
code:
// zyc 2018/7/23
#include <bits/stdc++.h>
using namespace std;
int main ()
{
std::ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
long long t; cin >> t;
while (t --) {
long long n; cin >> n;
if (n % 3 == 0) {
cout << n / 3 * n / 3 * n / 3 << endl;
} else if (n % 4 == 0) {
cout << n / 2 * n / 4 * n / 4 << endl;
} else {
cout << -1 << endl;
}
}
return 0;
}
C . Triangle Partition
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=6300
- 按照x坐标排序,贪心的每次选取最右边三个点,可以保证一定不相交。
code:
// zyc 2018/7/23
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 7;
struct node {
int x, y;
int id;
} a[maxn];
bool cmp (node &k, node &l) {
return k.x < l.x;
}
int main ()
{
std::ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t; scanf ("%d", &t);
while (t --) {
int n; scanf ("%d", &n);
for (int i = 0; i < n * 3; i ++) {
scanf ("%d %d", &a[i].x, &a[i].y);
a[i].id = i + 1;
}
sort (a, a + n * 3, cmp);
for (int i = 0; i < n; i ++) {
printf("%d %d %d\n", a[i * 3].id, a[i * 3 + 1].id, a[i * 3 + 2].id);
}
}
return 0;
}
K . Time Zone
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6308
- %f 输入X.Y,将其表示为分钟,转化为整型。直接加上去输出即可。
code:
// zyc 2018/7/23
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int n; scanf ("%d", &n);
while (n --) {
int k, l; float data;
scanf ("%d %d UTC%f", &k, &l, &data);
data -= 8;
data *= 60;
if (data > -0.01) {
l += (int)(data + 0.5);
} else {
l += (int)(data - 0.5);
}
while (l < 0) {l += 60; k --;}
while (l >= 60) {l -= 60; k ++;}
while (k < 0) k += 24;
k %= 24;
printf("%02d:%02d\n", k, l);
}
return 0;
}
D . Distinct Values
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6301
- 记录下每个点的最小区间左端点,set维护可以使用的值,贪心跑一遍
code:
// zyc 2018/7/23
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
const int M = 1e9 + 7;
int main ()
{
int t; scanf ("%d", &t);
while (t --) {
int n, m; scanf ("%d %d", &n, &m);
int pre [maxn], ans[maxn]; int l, r;
for (int i = 1; i <= n; i ++) pre [i] = i;
for (int i = 1; i <= m; i ++) {
scanf ("%d %d", &l, &r);
pre[r] = min (pre[r], l);
}
// puts ("1 2 3 4 5 6 7 8 9 10 11 12");
// for (int i = 1; i <= n; i ++) printf ("%d%c", pre[i], (i == n) ? '\n' : ' ');
for (int i = n - 1; i >= 1; i --) pre [i] = min (pre [i], pre [i + 1]);
// for (int i = 1; i <= n; i ++) printf ("%d%c", pre[i], (i == n) ? '\n' : ' ');
int res = 1; set <int> s;
for (int i = 1; i <= n; i ++) s.insert (i);
for (int i = 1; i <= n; i ++) {
while (res < pre [i]) {
s.insert (ans [res]);
res ++;
}
ans [i] = *s.begin ();
s.erase (ans[i]);
}
for (int i = 1; i <= n; i ++) printf ("%d%c", ans[i], (i == n) ? '\n' : ' ');
}
return 0;
}