Atcoder Tenka1 Programmer Contest 2019

C

签到题,f[i][0/1]表示以i结尾最后一个为白/黑的最小值,转移显然。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int n,f[N][2];
char s[N];
int main()
{
    scanf("%d",&n);
    scanf("%s",s+1);
    for(int i=1;i<=n;i++)
    if(s[i]==‘.‘)
    {
        f[i][0]=f[i-1][0];
        f[i][1]=min(f[i-1][0],f[i-1][1])+1;
    }
    else{
        f[i][0]=f[i-1][0]+1;
        f[i][1]=min(f[i-1][0],f[i-1][1]);
    }
    printf("%d\n",min(f[n][0],f[n][1]));
}

D

方案数=总方案数-不能拼成三角形的方案数。不能拼成三角形,即最长边大于等于边总和的一半。于是可以f[i]表示以i为最长边能组成三角形的方案数,g[i]表示凑成长度为i的边方案。f[0]=2^n,g[0]=1,然后每次转移f除以2即可。注意讨论最长边为总和一半的情况(没讨论WA了一发)。

#include<bits/stdc++.h>
using namespace std;
const int N=307,mod=998244353,inv2=499122177,inv3=332748118;
int n,ans,sum,lim,pw2[N],pw3[N],a[N],f[N*N],g[N*N];
int main()
{
    scanf("%d",&n);
    ans=f[0]=g[0]=1;
    for(int i=1;i<=n;i++)f[0]=2ll*f[0]%mod;
    for(int i=1;i<=n;i++)
    {
        ans=3ll*ans%mod;
        scanf("%d",&a[i]);
        sum+=a[i];
        for(int j=sum;j>=a[i];j--)
        f[j]=(f[j]+1ll*f[j-a[i]]*inv2)%mod,g[j]=(g[j]+g[j-a[i]])%mod;
    }
    lim=(sum+1)/2;
    for(int i=lim;i<=sum;i++)ans=(ans-3ll*f[i]%mod+mod)%mod;
    if(sum%2==0)ans=(ans+3ll*g[lim])%mod;
    printf("%d\n",ans);
}

E

F

rank=105,rating+=108,因为原本rating过低。

原文地址:https://www.cnblogs.com/hfctf0210/p/10743123.html

时间: 2024-10-08 21:50:22

Atcoder Tenka1 Programmer Contest 2019的相关文章

【AtCoder】Tenka1 Programmer Contest 2019

Tenka1 Programmer Contest 2019 C - Stones 题面大意:有一个01序列,改变一个位置上的值花费1,问变成没有0在1右边的序列花费最少多少 直接枚举前i个都变成0即可 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space

Tenka1 Programmer Contest 2019 D - Three Colors

Three Colors 思路:dp 设sum为所有边的总和 不能组成三角形的情况:某条边长度>=ceil(sum/2),可以用dp求出这种情况的方案数,然后用总方案数减去就可以求出答案. 注意当某两条边都为sum/2的时候,dp会多算一次,要减去多算的方案数,多算的方案数也可以用dp求 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/stdc++.h> u

Tenka1 Programmer Contest C - Align

链接 Tenka1 Programmer Contest C - Align 给定一个序列,要求重新排列最大化\(\sum_{i=2}^{i=n} |a_i-a_{i-1}|\),\(n\leq 10^5\) 小清新贪心,首先把最大的先放好,然后依次考虑下面四种决策: 左边放最小,右边放最小,左边放最大,右边放最大. 每次取\(max\)并更新左右端点,这样一定能取到最大最小的波浪形态,最大值旁边放两个最小不会更差. #include<bits/stdc++.h> #define R regi

[AtCoder] NIKKEI Programming Contest 2019 (暂缺F)

[AtCoder] NIKKEI Programming Contest 2019 ??本来看见这一场的排名的画风比较正常就来补一下题,但是完全没有发现后两题的AC人数远少于我补的上一份AtCoder. A - Subscribers ??首先始终 \(max = \min(A, B)\) ,\(min\) 的话如果 \(A + B \leq N\) ,那么就是 \(0\) ,否则就是 \(A + B - N\) . int n, a, b; int main() { read(n), read

AtCoder NIKKEI Programming Contest 2019 C. Different Strokes (贪心)

题目链接:https://nikkei2019-qual.contest.atcoder.jp/tasks/nikkei2019_qual_C 题意:给出 n 种食物,Takahashi 吃下获得 ai 快乐值,Aoki 吃下获得 bi 快乐值,两人轮流吃,他们的目标是最大化自己获得的快乐值减去她人获得的快乐值吗,问最后该值是多少. 题解:易知 Takahashi 要最大化答案而 Aoki 要最小化答案,考虑全部食物由 Aoki 吃下,则ans = -(b1 + b2 + .... + bn),

Atcoder Yahoo Programming Contest 2019 简要题解

A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO"); return 0; } B int d[N];pair<int,int>s[10]; int main() { for(int i=1,u,v;i<=3;i++){ u=read();v=read(); s[i].first=u;s[i].second=v; d[u]++;d[

atcoder NIKKEI Programming Contest 2019 E - Weights on Vertices and Edges

题目链接:Weights on Vertices and Edges 题目大意:有一个\(n\)个点\(m\)条边的无向图,点有点权,边有边权,问至少删去多少条边使得对于剩下的每一条边,它所在的联通块的点权值和大于等于该边的边权 其实是蛮简单的一道题目,为什么当时就自闭了呢... 正向删边明显不靠谱,于是我们考虑反向加边,答案就是\(m-\)加入的边数 我们按照边权排序,使用并查集维护点权值和,同时记录一个\(cnt\)数组表示当前存在于该联通块内但未加入答案的边数 如果说当前联通块的点权值和大

AtCoder AISing Programming Contest 2019 Task D. Nearest Card Game

题目分析在代码注释里. int main() { #if defined LOCAL && !defined DUIPAI ifstream in("main.in"); cin.rdbuf(in.rdbuf()); // ofstream out("main.out"); // cout.rdbuf(out.rdbuf()); #endif int n, q; scan(n, q); vi a(n); scan(a); vl sum(n); sum

Helvetic Coding Contest 2019 差A3 C3 D2 X1 X2

Helvetic Coding Contest 2019 A2 题意:给一个长度为 n 的01序列 y.认为 k 合法当且仅当存在一个长度为 n 的01序列 x,使得 x 异或 x 循环右移 k 位的 01 串得到 y .问合法的 k 的个数. \(n \le 2*10^5\) key:找规律 考虑如何check一个 k 是否合法.那么对于所有的 i 和 i-k 在模 n 的意义下,如果 y 的第 i 位为 0 则二者必须不同,否则必须相同.这样可以用并查集判断是否合法.实际上是把相同的缩起来后