SMU Summer 2024 Contest Round 4(7.16)

Made Up

题目链接

C - Made Up (atcoder.jp)

题目大意

给你三个数组分别为数组A、B、C,然后让你找有多少个A[ i ]==B[C[ i ]]。额,就题意这么简单

解题思路

跟着题意写,直接遍历,那你就……会和我一样T掉,哈哈,包超时,老弟。

其实我们可以这样,再开一个数组D,对于每个B[C[ i ]-1]都加1,即D[B[C[i]-1]]++,这样我们记录了什么呢?因为C[ i ]其实就是数组B的下标,所以D[B[C[i]-1]]我们就记录了对于每个B[ i ]会出现多少次。如果你有点懵,不用担心,因为现在我写题解的时候也有点懵逼我当时怎么想到这个解法的,可能是玩太多了,脑子退化了T*T

代码如下

#include<stdio.h>
int d[100010];
int main()
{
	int n;
	scanf("%d", &n);
	int a[n], b[n], c[n];
	for(int i=0;i<n;i++)
		scanf("%d", &a[i]);
	for(int i=0;i<n;i++)
		scanf("%d", &b[i]);
	for(int i=0;i<n;i++)
	{
		scanf("%d", &c[i]);
		d[b[c[i]-1]]++;
	}
	long long sum=0;
	for(int i=0;i<n;i++)
		sum+=d[a[i]];
	printf("%lld\n", sum);
	return 0;
}

H and V

Red and Green Apples

题目链接

E - 红苹果和绿苹果 (atcoder.jp)

题目大意

就是给你红、绿、无色三种颜色各A、B、C个,每个苹果都有他的美味程度,然后你可以选X个红苹果,Y个绿苹果,你在选红苹果和绿苹果时也可以用无色苹果代替他们,然后题目要你求出选取X个红苹果和Y个绿苹果后的最大美味程度

解题思路

 我们把红苹果中最大的X个和绿苹果中最大的Y个取出来,存入一个新的数组ab中,然后我们对数组ab进行从小到大的排序,再然后我们先对数组c从小到大排序,找到替换后的最大sum1 ,再将数组c从大到小排序,找到替换后最大的sum2,比较sum1和sum2,取最大值。

为什么我们要求两个sum,我们可以看一下这两组实例

示例1
2 2 3 3 3
1 2 3
4 5 6
7 8 9    //其最大值应该是30

示例2
3 3 3 3 6
1 2 3
1 2 3
4 4 4 4 2 2    //其最大值应该是22

代码如下

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int x, y, ax, bx, cx;
	scanf("%d%d%d%d%d", &x, &y, &ax, &bx, &cx);
	int a[ax], b[bx], c[cx];
	for(int i=0;i<ax;i++)
		scanf("%d", &a[i]);
	for(int i=0;i<bx;i++)
		scanf("%d", &b[i]);
	for(int i=0;i<cx;i++)
		scanf("%d", &c[i]);
	sort(a, a+ax, greater<int>());
	sort(b, b+bx, greater<int>());
	int ab[x+y+2];
	int abi=0;
	long long sum1=0;
	for(int i=0;i<x;i++)
	{
		ab[abi]=a[i];
		sum1+=a[i];
		abi++;
	}
	for(int i=0;i<y;i++)
	{
		ab[abi]=b[i];
		sum1+=b[i];
		abi++;
	}
	long long sum2=sum1;
	sort(ab, ab+abi);
	sort(c, c+cx);
	int cxi=0;
	for(int i=0;i<abi;i++)
	{
		if(cxi>=cx)
			break;
		if(c[cxi]>ab[i])
		{
			sum1-=ab[i];
			sum1+=c[cxi];
			cxi++;
		}
		else
			cxi++;
	}
	sort(c, c+cx, greater<int>());
	cxi=0;
	for(int i=0;i<abi;i++)
	{
		if(cxi>=cx)
			break;
		if(c[cxi]>ab[i])
		{
			sum2-=ab[i];
			sum2+=c[cxi];
			cxi++;
		}
		else
			break;
	}
	printf("%lld\n", max(sum1, sum2));
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值