补题题号:CFGHIKLM(咕咕咕 慢速补题中qwq)
A hdu6217 - BBP Formula
B hdu6218 - Bridge
C hdu6219 -Empty Convex Polygons
最大空凸包模板题。
D hdu6220 - Defense of the Ancients
E hdu6221 - Five-round Show Hand
F hdu6222 - Heron and His Triangle
打表出来的t是这样的
4
,
14
,
52
,
194
,
724......
4, 14, 52, 194, 724 ......
4,14,52,194,724......
a
n
s
[
i
]
=
a
n
s
[
i
−
1
]
∗
4
−
a
n
s
[
i
−
2
]
ans[i]=ans[i-1]*4-ans[i-2]
ans[i]=ans[i−1]∗4−ans[i−2]
还是用java的大整数类型做一下就可以了。
发现死活不会做的题但是大家过了很多就努力打表找规律???
import java.math.*;
import java.util.*;
class Main{
static List<BigInteger> fn = new ArrayList<>() ;
public static void pre_solve(){
fn.add(BigInteger.valueOf(4));
fn.add(BigInteger.valueOf(14));
BigInteger a = BigInteger.valueOf(4);
BigInteger b = BigInteger.valueOf(14);
for(int i = 3; i <= 200; i++){
BigInteger c = b.multiply(BigInteger.valueOf(4));
c = c.subtract(a);
fn.add(c);
a = b;
b = c;
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int T = in.nextInt();
pre_solve();
for(int i = 1; i <= T; i++)
{
BigInteger n;
n = in.nextBigInteger();
for(int j = 0; j < fn.size(); j++){
if(n.compareTo(fn.get(j)) <= 0){
System.out.println(fn.get(j));
break;
}
}
}
}
}
G hdu6223 - Infinite Fraction Path
H hdu6224 - Legends of the Three Kingdoms
I hdu6225 - Little Boxes
c++是不是要用高精啊qwq…
import java.math.BigInteger;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
Integer T;
T = input.nextInt();
for(int i = 1; i <= T; i++){
BigInteger a = input.nextBigInteger();
BigInteger b = input.nextBigInteger();
BigInteger c = input.nextBigInteger();
BigInteger d = input.nextBigInteger();
BigInteger ans = a.add(b);
ans = ans.add(c);
ans = ans.add(d);
System.out.println(ans);
}
}
}
J hdu6226 - New Self-describing Sequence
K hdu6227 - Rabbits
因为每次都要往里面跳,而且能跳则跳,最好多跳。
所以我们最佳方法是所有的间隙(两只兔子中间的坐标)都跳一遍。但是由于第一只兔子在“外面”,所以它和最近的一只兔子中间的间隙一定会牺牲掉。按坐标从小到大排序之后,对比最左边和最右边哪只兔子浪费掉的间隙少,减去即可。
#include<bits/stdc++.h>
#define MAXN 10010
using namespace std;
int T, n, ans;
int a[MAXN];
int main(){
#ifndef ONLINE_JUDGE
freopen("ce.in", "r", stdin);
#endif
scanf("%d", &T);
while(T--){
scanf("%d", &n);
ans = 0;
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(&a[1], &a[n + 1]);
int minn = min(a[2] - a[1] - 1, a[n] - a[n - 1] - 1);
for(int i = 2; i <= n; i++){
ans += a[i] - a[i - 1] - 1;
}
ans -= minn;
printf("%d\n", ans);
}
return 0;
}
L hdu6228 - Tree
考虑dfs,如果该边的两边都有大于等于k个点,那么显然可以加入到答案里面。
考虑如果有两个合法边,那他们中间相连的边一定也是合法边。(题目要求合法边数量最多,所以这样统计)
#include<bits/stdc++.h>
#define MAXN 200010
using namespace std;
int T, t, ans, n, k;
int head[MAXN], son[MAXN];
struct Edge{int nxt, to;}edge[MAXN << 1];
inline void add(int from, int to){
edge[++t].nxt = head[from], edge[t].to = to;
head[from] = t;
}
inline void solve(int x, int f){
son[x] = 1;
for(int i = head[x]; i; i = edge[i].nxt){
int v = edge[i].to;
if(v == f) continue;
solve(v, x);
son[x] += son[v];
}
if(son[x] >= k && n - son[x] >= k) ans++;
}
inline void clear(){
t = ans = 0;
memset(head, 0, sizeof(head));
}
int main(){
#ifndef ONLINE_JUDGE
freopen("ce.in", "r", stdin);
#endif
scanf("%d", &T);
while(T--){
scanf("%d%d", &n, &k);
clear();
int u, v;
for(int i = 1; i < n; i++){
scanf("%d%d", &u, &v);
add(u, v), add(v, u);
}
solve(1, 0);
printf("%d\n", ans);
}
return 0;
}