Codeforces Round #683 (Div. 2, by Meet IT) 题解报告

本文解析了一道关于调整糖果数量使其相等的构造题,通过AC代码展示了如何在n个袋子中逐步平衡糖果,总共仅需n次操作。另外,还介绍了两道编程题目的解法:NumbersBox中利用矩阵操作优化最大元素和,Knapsack中求背包中满足特定条件的重量和。
摘要由CSDN通过智能技术生成

A.Add Candies

题目链接

题意:

有n个袋子装着糖果,最初第i个袋子装着i个糖果。你希望所有的袋子里都含有相同数量的糖果。执行m操作。在第j次操作中,你将取出一个袋子,并在除选中的袋子外的所有袋子中添加j个糖果。你的目标是找到一个有效的操作序列,使得所有的袋子将包含等量的糖果。

思路:

一道简单的构造题,通过规律可知对于n袋糖果,只需要操作n次,从第一袋操作到最后一袋即可。(例如三袋时,【1,2,3】,操作第一袋,【1,3,4】,操作第二袋,【3,3,6】,操作第三袋,【6,6,6】,符合题意)。

AC代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <map>
#include <ext/rope>
#include <algorithm>
 
using namespace std;
 
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int b;
        cin>>b;
        cout<<b<<endl;
        for(int i=1;i<=b;i++)
        {
            printf("%d ",i);
        }
        printf("\n");
    }
    return 0;
}

B.Numbers Box

题意:

给你一个n*m的矩阵,你可以使相邻两个元素的值同时乘以-1(改变符号),不限次数,问矩阵最大元素和是多少。

思路:

先计算非正数的个数,判断奇偶,如果是偶数,证明所有非正数都能翻过来,直接输出绝对值之和,如果是奇数,输出绝对值之和减去两倍的最小的绝对值

AC代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <map>
#include <ext/rope>
#include <algorithm>
 
using namespace std;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int sum=0;
        int sum1=0;
        int ans=0;
        int maxx=10000;
        int maps[15][15];
        int num0=0;
        int n,m;
        int x1=0,y1=0;
        cin>>n>>m;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                cin>>maps[i][j];
                maxx=min(abs(maps[i][j]),maxx);
                if(maps[i][j]>0)
                {
                    ans+=abs(maps[i][j]);
                }
                else
                {
                    ans+=abs(maps[i][j]);
                    sum1++;
                }
            }
        }
        if(sum1%2!=0)
        {
            ans-=2*maxx;
        }
        cout<<ans<<endl;
    }
    return 0;
}

C.Knapsack

题意:

你有一个容量为w的背包,还有n件物品,第i件重量为wi。
把部分物品放入背包,其总重量大于w/2小于w,输出任意满足条件的重量总和

思路:

在输入的时候先过滤掉所有大于w的物品,将剩下的物品排序,从大到小便遍历,遇到大于w/2的可以直接输出,因为剩下的都小于w/2,所以可以从到小贪心直到总和大于w/2就可以输出。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <map>
#include <ext/rope>
#include <algorithm>
 
using namespace std;
struct st
{
    int num;
    int val;
}st[200000+5];
 
int cmp(const struct st a,const struct st b)
{
    return a.val>b.val;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int flag=0;
        long long n,w;
        int cnt=0;
        scanf("%lld%lld",&n,&w);
        for(int i=1;i<=n;i++)
        {
            int t;
            scanf("%d",&t);
            if(t<=w)
            {
                st[++cnt].val=t;
                st[cnt].num=i;
            }
        }
        w++;
        sort(st+1,st+cnt+1,cmp);
        long long qw=0;
        long long qq=0;
        for(int i=1;i<=cnt;i++)
        {
            qq+=st[i].val;
            if(qq>w/2)
                break;
        }
        if(qq<w/2)
        {
            printf("-1\n");
            continue;
        }
        int e[200002];
        int cnt2=0;
        for(int i=1;i<=cnt;i++)
        {
            if(1L*st[i].val>w/2)
            {
                e[i]=st[i].num;
                cnt2=i;
                break;
            }
            qw+=st[i].val;
            e[i]=st[i].num;
            if(qw>=w/2)
            {
                cnt2=i;
                break;
            }
        }
        printf("%d\n",cnt2);
        for(int i=1;i<=cnt2;i++)
            printf("%d ",e[i]);
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值