BestCoder Round #92 第一次BC

1001:STL
1002:DP
1003:DP
1004:Unfinished

像我这种几乎没打过什么线上比赛的蒟蒻已经很少了吧。上午的时候发现晚上有一场BC,于是毫不犹豫地报(爆)名(零)了。


1001 Skip the Class

用map,string,sort什么的xjb搞一下就行了。(上机太迟,交得比较晚)

#include<cstdio> 
#include<string>
#include<algorithm>
#include<map>
#include<iostream>
#define N 105
using namespace std;
struct Pair
{
    string s; int v;
    bool operator < (Pair that) const
    {
        return v > that.v;
    }
}p[N];
namespace runzhe2000
{
    void main()
    {
        int T; scanf("%d",&T);
        for(; T--; )
        {
            int n; scanf("%d",&n);
            for(int i = 1; i <= n; i++)
                cin >> p[i].s >> p[i].v;
            sort(p+1, p+1+n);
            map<string, int> vis;
            int ans = 0;
            for(int i = 1; i <= n; i++)
            {
                if(vis[p[i].s] < 2)
                {
                    vis[p[i].s]++;
                    ans += p[i].v;
                }
            }
            printf("%d\n",ans);
        }
    }
}
int main()
{
    runzhe2000::main();
}

1002 Count the Sheep

记f[i][0/1/2/3]表示从i开始继续走0/1/2/3次的方案数,从二分图的另一个点集里所有可以到达的点转移过来,再减去那个点走向自己的方案数即可。
然后就FST了,原因是TLE。。。QAQ我就当攒人品吧。
辣鸡BC,卡我常数,使我爆零,掉我排名,毁我青春。
以下为优化过后的可通过代码。

#include<cstdio>
#include<cstring> 
#include<algorithm>
#define N 100005
#define ll long long
using namespace std;
namespace runzhe2000
{
    ll f[N][4], ans;
    int n, m, k, a[N], b[N];
    int read()
    {
        int r = 0; char c = getchar();
        for(; c < '0' || c > '9'; c = getchar());
        for(; c >='0' && c <='9'; r = r*10+c-'0', c = getchar());
        return r;
    }
    void dp()
    {
        memset(f, 0, sizeof f);
        for(int i = 1; i <= m; i++) f[i][0] = 1;

        for(int i = 1; i <= k; i++)
            f[a[i]][1] += f[b[i]][0];
        for(int i = 1; i <= k; i++)
            f[b[i]][2] += f[a[i]][1] - f[b[i]][0];
        for(int i = 1; i <= k; i++)
            f[a[i]][3] += f[b[i]][2] - f[a[i]][1] + 1;
        for(int i = 1; i <= n; i++)
            ans += f[i][3];
    }
    void main()
    {
        int T; scanf("%d",&T);
        for(; T--; )
        {
            n = read(), m = read(), k = read(), ans = 0;
            for(int i = 1; i <= k; i++) a[i] = read(), b[i] = read(); 
            dp();
            printf("%lld\n",ans<<1);
        }
    }
}
int main()
{
    runzhe2000::main();
}

1003 Girls Love 233

考场上想了一个DP,脑补了一下好像没什么问题。没rush出来。有空再搞搞看。
UPD(2017/02/25 23:58):好吧写完了。我好弱啊,考场上这种这么短的题都没写出来。自己每次到考场上都会紧张,各种傻眼,各种丢东西。自己做题的时候各种顺,在考场上就各种坑细节,果然没救。
一个233是否存在显然只跟前后两个2的位置有关,记f[i][j][k]表示第i个2放在j位置,此时还剩k次移动机会,最大的233个数。

#include<cstdio>
#include<algorithm>
#define N 105
using namespace std;
namespace runzhe2000
{
    const int INF = 1<<30;
    char s[N];
    int f[N][N][N<<1], pos[N], n, m, cnt, ans;
    int abs(int x){return x<0?-x:x;}
    void main()
    {
        int T; scanf("%d",&T);
        for(; T--; )
        {
            scanf("%d%d%s",&n,&m,s+1);
            m >>= 1; cnt = 0; s[++n] = '2';
            for(int i = 1; i <= n; i++)
                if(s[i] == '2') pos[++cnt] = i;
            for(int i = 0; i <= cnt; i++)
                for(int j = 0; j <= n; j++)
                    for(int k = 0; k <= m; k++)
                        f[i][j][k] = -INF;
            f[0][0][m] = ans = 0;
            for(int i = 1; i <= cnt; i++)
            {
                for(int j = i; j <= n; j++)
                {
                    int w = abs(pos[i] - j);
                    for(int k = 0, kk = m - w; k <= kk; k++)
                    {
                        for(int l = j-1; l >= 0; l--)
                        {
                            f[i][j][k] = max(f[i][j][k], f[i-1][l][k+w] + (j-l>2 && i-1?1:0));
                        }
                    }
                }
            }
            for(int j = 1; j <= n; j++)
                for(int k = 0; k <= m; k++)
                    ans = max(ans, f[cnt][j][k]);
            printf("%d\n",ans);
        }
    }
}
int main()
{
    runzhe2000::main();
}

1004 Game Arrangement

以后再填。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值