关闭

数据结构与算法实验题 5.3 计分

427人阅读 评论(0) 收藏 举报
分类:
数据结构与算法实验题 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

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); 
  
}  


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:22883次
    • 积分:769
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:16篇
    • 译文:0篇
    • 评论:0条
    学习目标
    http://hi.baidu.com/aekdycoin