6月16日 AtCoder Beginner Contest
题目链接:https://abc100.contest.atcoder.jp/

A – Happy Birthday! & B – Ringo’s Favorite Numbers

比较水。。。
B题一定要弄清楚题意!!!注意特判!!!

C – *3 or /2

思路:
因为题目希望操作次数尽量多,所以我们可以贪心,每次只让一个数除2,其余乘3。那么这样,总操作次数便是每个数能够除以2的次数之和。

代码:

#include <cstdio>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std;

LL n, ans, a[10005];

int main()
{
    scanf("%lld", &n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d", &a[i]);
        while(a[i]%2==0)
        {
            a[i]/=2;
            ans++;
        }
    }
    printf("%d\n", ans);
}

D – Patisserie ABC

思路:
这道题的做法稍稍有一点暴力。首先可以枚举三个值的正负情况,然后就可以计算每一个蛋糕对于三个值的贡献之和。排一个序,取前m个蛋糕的贡献之和用来更新答案。

代码;

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define LL long long
using namespace std;

int n, m, act[5], q[1005];
LL ans, b[1005], a[1005][5];

bool CMP(LL x, LL y) {return x>y;}

void dfs(int x)
{
    if(x==3)
    {
        LL temp=0; memset(b, 0, sizeof(b));
        for(int i=0; i<3; i++)
        {
            if(act[i]==1) for(int j=1; j<=n; j++) b[j]+=a[j][i];
            else for(int j=1; j<=n; j++) b[j]-=a[j][i];
        }
        sort(b+1, b+n+1, CMP);
        for(int i=1; i<=m; i++) temp+=b[i];
        if(temp>ans) ans=temp;
        return;
    }
    for(int i=1; i<=2; i++)
    {
        act[x]=i;
        dfs(x+1);
    }
}

int main()
{
    scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++) scanf("%lld%lld%lld", &a[i][0], &a[i][1], &a[i][2]);
    dfs(0);
    printf("%lld\n", ans);
}

发表评论

邮箱地址不会被公开。 必填项已用*标注