2017ACM/ICPC亚洲区沈阳站 补题 | 题解

补题题号: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[i1]4ans[i2]

还是用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;
}

M hdu6229 - Wandering Robots

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值