AtCoder Beginner Contest 331(c/c++)(部分题解)

A Tomorrow

思路:if else语句练习题,注意别漏情况就行啦

AC Code

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#define ll long long
using namespace std;

int main(void)
{
    int M,D;
    scanf("%d%d",&M,&D);
    int y,m,d;
    scanf("%d%d%d",&y,&m,&d);
    if (m>=M&&d>=D)
    {
        m=1;
        d=1;
        y++;

    }else if (d>=D&&m<M)
    {
        d=1;
        m++;
    }else{
        d++;
    }
    printf("%d %d %d",y,m,d);
    return 0;
}

B Buy One Carton of Milk

思路:数据量很小,暴力就行啦

AC Code

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#define ll long long
using namespace std;
ll n;
ll ans = 1e9;
ll a[4] = {0};
int main(void)
{
    scanf("%lld", &n);
    for (int i = 1; i <= 3; i++)
    {
        scanf("%lld", &a[i]);
    }
    int r1 = n / 6 + 1;
    int r2 = n / 8 + 1;
    int r3 = n / 12 + 1;
    for (int i = 0; i <= r1; i++)
    {
        for (int j = 0; j <= r2; j++)
        {
            for (int k = 0; k <= r3; k++)
            {
                if ((n <= i * 6 + j * 8 + k * 12) && (i != 0 || j != 0 || k != 0) && (i * a[1] + j * a[2] + k * a[3] <= ans))
                {
                    ans = i * a[1] + j * a[2] + k * a[3];
                }
            }
        }
    }
    printf("%lld", ans);
    return 0;
}

C Sum of Numbers Greater Than Me

思路一:阅读题目,注意到要求出一个答案数组,不妨设为ans[],一开始没读入任何数据时,ans全为0,当读入一个数据"x"时,ans数组中ans[x]前所有数据全部加"x",同时考虑时间复杂度,自然想到修改ans[]的差分数组以代替上述操作

AC Code

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#define ll long long
using namespace std;
ll a[200005]={0};
ll diff[2000000]={0};
ll prefix[2000000]={0};
int main(void)
{
    int n;
    scanf("%d",&n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld",&a[i]);
        diff[1]+=a[i];
        diff[a[i]]-=a[i];
    }
    for (int i = 1; i <= 2000000-1 ; i++)
    {
        prefix[i]=prefix[i-1]+diff[i];
    }
    for (int i = 1; i <= n; i++)
    {
        printf("%lld ",prefix[a[i]]);
    }
    
    return 0;
}

思路二:题目与顺序有关,我们自然可以考虑排序,当排完序(该题的特殊性,我们考虑运用set去重降序,同时统计每个数的个数),我们不难发现,设b[i]=a[i]*个数,对b[i]做前缀和,ans[a[i]]=prefix[a[i]];(这个就给想试一下的人留着吧)

E Set Meal

一道纯纯的暴力题,除要会一点STL没啥好说的

AC Code

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <utility>
#include <set>
#define ll long long
using namespace std;
const int k = 1e5 + 10;
int n, m, L;
int a[k] = {0}, b[k];
pair<int, int> c[k];
pair<int, int> d[k];
set<int> w[k];
bool cmp(pair<int, int> a1, pair<int, int> b1)
{
    return a1.first > b1.first;
}
int main(void)
{
    scanf("%d%d%d", &n, &m, &L);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        c[i].first = a[i];
        c[i].second = i;
    }
    for (int i = 1; i <= m; i++)
    {
        scanf("%d", &b[i]);
        d[i].first = b[i];
        d[i].second = i;
    }
    sort(c + 1, c + n + 1, cmp);
    sort(d + 1, d + m + 1, cmp);
    int l = 0, r = 0;
    for (int i = 1; i <= L; i++)
    {
        scanf("%d%d", &l, &r);
        w[l].insert(r);
    }
    int ans = -1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (w[c[i].second].find(d[j].second) == w[c[i].second].end())
            {
                ans = max(c[i].first + d[j].first, ans);
                break;
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值