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!−(n−1)!) 化简一下就是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