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

原创 2013年12月03日 20:55:29
数据结构与算法实验题 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); 
  
}  


相关文章推荐

【数据结构】算法5.3 行逻辑链接的顺序表-乘积

#include #include #include #include#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #defi...

数据结构与算法实验题 7.1 M 商人的求救

问题描述: A 国正面临着一场残酷的战争,城市被支持不同领导的两股势力占据,作为一个商人,M先生并不太关心政治,但是他知道局势很严重,他希望你能救他出去。M 先生说:“为了安全起见,我们的路线最多只能...

数据结构与算法实验题-战争来了

★实验任务 兽族和不死又要开战了。但是兽族的军队都是分部落管理的,为此,兽王 ——先知萨尔,要先知道自己能调度多少军队,才能在跟不死族开战的时候做好部署。已知现在兽族有 N 个兽人,编号从 1 到 N...

福大数据结构与算法实验题 Who is behind(双端队列)

★实验任务 开学了,有 N 个新生需要排成一列。这 N 个新生编号从 1 到 N,为了排队方便,按编号 从 1 到 N 顺序入队伍,起始队伍为空,每个人进队伍的选择有两种,一种是直接排在当前队 ...

数据结构与算法实验题 9.1 K 歌 DFS+剪枝

数据结构与算法实验题 K 歌 ★实验任务 3* n 个人(标号1 3 n )分成 n 组 K 歌。有 m 个 3 人组合,每个组合都对应一个分数,你能算出最大能够得到的总分数么? ★数据输入 输入的第...

数据结构与算法实验题 11.3 最小权语言问题

★问题描述:  字母表 A 由 m 个英文字母组成。字母表中的每个英文字母都有一个权。一个单词的权是单词中每个字母的权之和。定义在字母表上的语言是由字母表中字母组成的不同单词的集  合。一个语言的权是...

数据结构与算法实验题 5.2 排序

数据结构与算法实验题 5.2 排序 ★实验任务 通过交换元素位置实现排序的算法通常称为交换排序算法。如果只允许交换相邻元素的 位置,则称为相邻交换排序算法,如冒泡排序算法。 给定 n 个待排成...

数据结构与算法实验报告

  • 2014年06月30日 21:17
  • 450KB
  • 下载

南邮数据结构实验四----各种内排序算法的实现及性能比较

一、 实验目的和要求 内容: 验证教材的各种内排序算法。分析各种排序算法的时间复杂度。 要求: 使用随机数产生器产生大数据集合,运行上述各种排序算法,使用系统时钟测量各算法所需的实际时间,并进...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构与算法实验题 5.3 计分
举报原因:
原因补充:

(最多只允许输入30个字)