Codeforces Round #322 (Div. 2) 581A 581B 581C

581A链接:点击打开链接


给你a只红袜子,b只蓝袜子,问你可以组成多少对颜色不同的袜子以及剩下多少对单色袜子。


小小的脑洞,答案分别为a, b最小值以及a - b绝对值的一半。


AC代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
int a, b;
int main(int argc, char const *argv[])
{
    scanf("%d%d", &a, &b);
    printf("%d %d\n", min(a, b), abs(a - b) / 2);
    return 0;
}


581B链接:点击打开链接


给你n,接下来一行n个数字代表第i个房子的楼层数量,问你房子加多少楼层才能使得每个房子均为luxurious。房子为luxurious当此

房子比右边任意房子楼层数量都多。


脑洞题目,因为是要求每个房子均为luxurious,所以应从右边遍历,不断更新房子楼层数才能使得所有房子均为luxurious。采用两

个数组,一个记录原楼层信息,一个记录当前房子右边所有房子楼层数量的最大值与当前房子楼层数量的关系。最后比较即可。


AC代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 1e5 + 5;
int n, m = -1, a[MAXN], ans[MAXN];
int main(int argc, char const *argv[])
{
    scanf("%d", &n);
    for(int i = 0; i < n; ++i)
        scanf("%d", &a[i]);
    for(int i = n - 1; i >= 0; --i) {
        if(a[i] > m) ans[i] = a[i];
        else if(a[i] == m) ans[i] = -1;
        else ans[i] = m;
        m = max(m, a[i]);
    }
    for(int i = 0; i < n - 1; ++i)
        if(ans[i] == a[i]) printf("0 ");
        else if(ans[i] == -1) printf("1 ");
        else printf("%d ", ans[i] - a[i] + 1);
    printf("0\n");
    return 0;
}


581C链接:点击打开链接


给你n, k,接下来一行n个数字代表n个skill,skill值不会超过100,现在你有k个技能点,问你将技能点加到skill以后skill / 10总合的最

大值。


脑洞题目,读入数据后首先排序,余数越大的越靠前,这样分配技能点的时候花费技能点少。分配技能点之后算出skill还差多少到最

大值100或是超过100多少,如果k不够这个总和,那么就算出k可以增加多少个10,sum + ans / 10即为所求答案。


AC代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 1e5 + 5;
int n, k, ans, sum, a[MAXN];
bool cmp(int a, int b)
{
    return a % 10 > b % 10;
}
int main(int argc, char const *argv[])
{
    scanf("%d%d", &n, &k);
    for(int i = 0; i < n; ++i)
        scanf("%d", &a[i]);
    sort(a, a + n, cmp);
    for(int i = 0; i < n; ++i) {
        int tmp = 10 - a[i] % 10;
        if(tmp <= k) {
            k -= tmp;
            a[i] += tmp;
        }
        else break;
    }
    for(int i = 0; i < n; ++i) {
        int tmp = 100 - a[i];
        ans += tmp;
    }
    if(ans > k) ans = k - k % 10;
    for(int i = 0; i < n; ++i)
        sum += a[i] / 10;
    printf("%d\n", sum + ans / 10);
    return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值