数据结构与算法实验题 5.3 计分
★实验任务
给定 n 个数 Ai(1<=i<=n),每个数由花色 R/B 加上一个值小于 5000000 的自然数构成,
比如"R1","B100",求 R,B 的分数(R、B 的初始分数为 0)。
我们的计分方式是,对于每一对的 Ai、Aj,(1<= i,j<=n),如果 Ai 和 Aj 的花色不同
并且 value(Ai)>value(Aj),则 Aj 所对应的花色的分数加上 value(Ai),花色相同则无视掉。 ★数据输入
输入第一行为一个正整数 n (n< =1000000)
输入第二行为 n 个数,由空格隔开
注意:输入输出请用 scanf,printf
★数据输出
输出两个数,花色 R 的分数和花色 B 的分数,由空格隔开
Hint:请用__int64 来计算分数
输入示例 输出示例
4
R4 B3 R1 B5
★实验任务
给定 n 个数 Ai(1<=i<=n),每个数由花色 R/B 加上一个值小于 5000000 的自然数构成,
比如"R1","B100",求 R,B 的分数(R、B 的初始分数为 0)。
我们的计分方式是,对于每一对的 Ai、Aj,(1<= i,j<=n),如果 Ai 和 Aj 的花色不同
并且 value(Ai)>value(Aj),则 Aj 所对应的花色的分数加上 value(Ai),花色相同则无视掉。 ★数据输入
输入第一行为一个正整数 n (n< =1000000)
输入第二行为 n 个数,由空格隔开
注意:输入输出请用 scanf,printf
★数据输出
输出两个数,花色 R 的分数和花色 B 的分数,由空格隔开
Hint:请用__int64 来计算分数
输入示例 输出示例
4
R4 B3 R1 B5
13 4
/*思路:对于输入的R和B,我们先对他们的值分别进行有小到大排序,然后开始检查他们的大小*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int p_r[1000000],p_b[1000000];
bool cmp(int a,int b)
{
return a<b;
}
int main()
{
__int64 n,i,sumr=0,sumb=0,d,count_r=0,count_b=0,j,r,b;
char c,s;
scanf ("%I64d",&n);
c=getchar();
memset(p_r,0,sizeof(p_r));
memset(p_b,0,sizeof(p_b));
for(i=0;i<n;i++)
{
scanf("%c%I64d",&s,&d);
c=getchar();
if(s=='R')
{
sumr+=d;
p_r[count_r++]=d;
}
if(s=='B')
{
sumb+=d;
p_b[count_b++]=d;
}
}
sort(p_r,p_r+count_r,cmp);
sort(p_b,p_b+count_b,cmp);
__int64 sum1,sum2;
sum1=sum2=0;
j=0;
for(i=0;i<count_r;i++)
{
if(p_r[i]<p_b[j]) //如果r<b,那么sum1就是加上sumb的值。
{
sum1+=sumb;
sumr-=p_r[i]; //b之后的元素都大于现在的这个r,所以sumr减去他。
}
if(p_r[i]==p_b[j]) //相等是一个难点。分别从r,b里找出相等的值各有几个。
{
for(b=j;b<count_b;b++)
{
if(p_b[b]!=p_b[j])
break;
}
for(r=i;r<count_r;r++)
{
if(p_r[r]!=p_r[i])
break;
}
sumb-=p_b[j]*(b-j);//因为相等所以无需再管他们,就拿他们都减掉。
sumr-=p_r[i]*(r-i);
sum1+=sumb*(r-i); //之后的值都会大于现在的值,所以有n个相等就把他们分别加到sum1和sum2
sum2+=sumr*(b-j);
i=r-1;
j=b;
if(j==count_b)
break;
}
if(p_r[i]>p_b[j]) //这里和第一种情况类似。
{
sumb-=p_b[j];
sum2+=sumr;
j++;
i--;
if(j==count_b)
break;
}
}
printf("%I64d %I64d\n",sum1,sum2);
}