Made Up
题目链接
题目大意
给你三个数组分别为数组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
题目链接
题目大意
就是给你红、绿、无色三种颜色各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;
}