CCPC 2017-2018, Finals 一些题解

这篇博客分享了CCPC 2017-2018总决赛中部分题目的解题思路,包括C题的得分策略分析,A题的数学期望计算,F题的简单计算,G题的动态规划解决方案,K题的棋盘状态枚举,J题的差分约束问题,以及I题在树形结构上的颜色计数问题。涉及数学、算法和逻辑推理。
摘要由CSDN通过智能技术生成

C - Rich Game
题意有点坑。
解法是二分会赢多少局,只要满足赢若干局而且不会输钱的条件就行,注意如果每次得分输的钱比失分得的钱少,那么就是全部胜利了。
A - Dogs and Cages
水题。求一个序列随机排列之后,还在原来位置上的期望。
对于一个数来说,在自己位置上的情况数是n! - (n-1)!,一共有n个数,总共有n!种情况,答案就是 n ∗ ( n ! − ( n − 1 ) ! ) n ! {n * (n! - (n-1)!)} \over n! n!n(n!(n1)!) 化简一下就是n-1
F - Fair Lottery
黑了一波Goden Bear还行……
水题,读完题之后就是每个数乘1.1向上取整求个和
G - Alice’s Stamps
这道题就其实就是个dp,用dp[i][j] 代表前i个邮票,选择k个set的最优方案,首先每个方案都可以被拆分,那我们我们维护每个邮票最多能向右延伸多少距离,然后分不增加答案和增加答案两种情况考虑。

#include <bits/stdc++.h>
#include  <bitset>
#define ll long long
#define INF 0x3f3f3f3f
#define pr pair<int,int>
#define fi first
#define next fuck
#define se second
using namespace std;
const int maxn = 2002;
int dp[maxn][maxn];
int rt[maxn];
int main()
{
   

    int ca,cat = 1;
    cin>>ca;
    while(ca--)
    {
   
        int n,m,k;
        cin>>n>>m>>k;
        memset(dp,0,sizeof(dp));
        memset(rt,0,sizeof(rt));
        for(int i = 0;i<m;i++)
        {
   
            int l,r;
            cin>>l>>r;
            rt[l-1] = max(rt[l-1],r - l + 1);
        }
        for(int i = 1;i<n;i++)
        {
   
            rt[i] = max(rt[i],rt[i-1] -1);
        }

        for(int i = 0;i<n;i++)
        {
   
            for(int j = 0;j<=k;j++)
            {
   
                dp[i+1][j] = max(dp[i+1][j],dp[i][j]);
                dp[i][j+1] = max(dp[i][j+1],dp[i][j]);
                dp[i + rt[i]][j+1] = max(dp[i + rt[i]][j+1],dp[i][j]+rt[i]);
            }
        }
        printf("Case #%d: %d\n",cat++,dp[n][k]);
    }
    return 0;
}

K - Knightmare
强行打表,注意打表的时候要注意可以走重复的点。找到规律发现最大值大概有12e18左右,要开unsigned long long 才能过,当n <= 4 的时候中心区域没有填满,需要直接输出打表的结果

#include <bits/stdc++.h>
#include <cstring>
#define ll unsigned long long
using namespace std;
int x,y,k;
ll a[10] = {
   1,9,41,109
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值