博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YYHSOI模拟赛题解(T5卡片游戏)
阅读量:4628 次
发布时间:2019-06-09

本文共 4046 字,大约阅读时间需要 13 分钟。

题目描述

小D举办了元旦联欢活动,其中有一个卡片游戏。

游戏的规则是这样的:有n张卡片,每张卡片上正面写着一个小于等于100的正整数ai,反面都是一样的花色。这n张卡片正面朝下叠成一堆,玩这个游戏的人从中可以抽出连续的k(1≤kn)张卡片。如果对于这k张卡片上的数字的平均值a,满足l<=a<=r,那他就可以获得小礼物一件。

小W来玩这个游戏了,她事先通过某些途径知道了这n张卡片上写的数字,现在她想知道她获得小礼物的期望值。

小W对小数很头疼,所以请你用分数的形式告诉她答案。

 

输入

输入文件名为game.in

输入第1行,三个整数nlr

第2行,包含n个整数ai

 

输出

输出文件名为game.out

输出仅1行,表示小W获得小礼物的期望值。输出格式为“P/Q”(PQ互质)。如果期望值是01就不用输出分数了

 

样例输入

game.in
4 2 3
3 1 2 4
game.out
7/10

样例输出

【输入输出样例2】
game.in
4 1 4
3 1 2 4
game.out 1

提示

 

【输入输出样例解释1】

【输入输出样例解释1】抽出的卡片

a(保留2位小数)

是否满足l<=a<=r

 

3

3.00

 

1

1.00

2

2.00

 

4

4.00

3,1

2.00

 

1,2

1.50

2,4

3.00

 

3,1,2

2.00

 

1,2,4

2.33

 

3,1,2,4

2.50

 

 【输入输出样例解释2】

由上表得,小W总是可以获得小礼物。因此期望值是1

 

【数据范围】

对于30%的数据,0<n≤10,000;

对于70%的数据,0<n≤100,000;

对于100%的数据,0<n≤500,000,0<l<r≤100。

由表可得,一共有10种情况,其中有7种情况小W可以获得小礼物。因此小W获得小礼物的期望值是7/10。

 

这一道题目我刚开始也没有什么头绪。但是一看题解就是恍然大悟的节奏。题解使用的思想相当于片段和思想。你要求的是区间内和处于l,r的个数。经过变形,我们会发现这就是一个求解逆序对,非常的神奇。它就运用到了一些片段和的思想,我们可以直接求解>=l的个数和>r的个数,最后减一减就是在l,r区间内的答案了。

 

1 #include 
2 #include
3 #include
4 #include
5 #include
6 7 using namespace std; 8 9 struct node 10 { 11 long long X,Y; 12 }; 13 14 int N; 15 long long L,R; 16 long long RR[1000005]; 17 node a[1000005]; 18 long long s[1000005]; 19 long long AnsA,AnsB; 20 21 void gbsort1(int l,int r) 22 { 23 int mid=(l+r)/2; 24 if (l == r) return; 25 gbsort1(l,mid); 26 gbsort1(mid+1,r); 27 int head1=l; 28 int tail1=mid; 29 int head2=mid+1; 30 int tail2=r; 31 int len=head1-1; 32 while (head1 <= tail1 && head2 <= tail2) 33 { 34 if (a[head1].X < a[head2].X) 35 { 36 RR[++len]=a[head1].X; 37 head1++; 38 } 39 else if (a[head1].X >= a[head2].X) 40 { 41 RR[++len]=a[head2].X; 42 head2++; 43 AnsA+=(tail1-head1+1); 44 } 45 } 46 while (head1 <= tail1) 47 { 48 RR[++len]=a[head1].X; 49 head1++; 50 } 51 while (head2 <= tail2) 52 { 53 RR[++len]=a[head2].X; 54 head2++; 55 } 56 for (int i=l; i<=r; i++) 57 { 58 a[i].X=RR[i]; 59 } 60 } 61 62 void gbsort2(int l,int r) 63 { 64 int mid=(l+r)/2; 65 if (l == r) return; 66 gbsort2(l,mid); 67 gbsort2(mid+1,r); 68 int head1=l; 69 int tail1=mid; 70 int head2=mid+1; 71 int tail2=r; 72 int len=head1-1; 73 while (head1 <= tail1 && head2 <= tail2) 74 { 75 if (a[head1].Y <= a[head2].Y) 76 { 77 RR[++len]=a[head1].Y; 78 head1++; 79 } 80 else if (a[head1].Y > a[head2].Y) 81 { 82 RR[++len]=a[head2].Y; 83 head2++; 84 AnsB+=(tail1-head1+1); 85 } 86 } 87 while (head1 <= tail1) 88 { 89 RR[++len]=a[head1].Y; 90 head1++; 91 } 92 while (head2 <= tail2) 93 { 94 RR[++len]=a[head2].Y; 95 head2++; 96 } 97 for (int i=l; i<=r; i++) 98 { 99 a[i].Y=RR[i];100 }101 }102 103 long long gcd(long long a,long long b)104 {105 if (b == 0) return a;106 else return gcd(b,a % b);107 }108 109 int main()110 {111 scanf("%d%lld%lld",&N,&L,&R);112 for (int i=1; i<=N; i++)113 {114 int X;115 scanf("%d",&X);116 s[i]=s[i-1]+X;117 a[i].X=L * i - s[i];118 a[i].Y=R * i - s[i];119 }120 AnsA=0; AnsB=0;121 gbsort1(0,N);122 gbsort2(0,N);123 //printf("%lld %lld\n",AnsA,AnsB);124 long long Tmp=(long long) N;125 Tmp=Tmp * (Tmp + 1) / 2;126 long long Ans=AnsA-AnsB;127 if (Ans == Tmp)128 {129 printf("1\n");130 }131 else if (Ans == 0)132 {133 printf("0\n");134 }135 else136 {137 long long D=gcd(Ans,Tmp);138 printf("%lld/%lld\n",Ans/D,Tmp/D);139 }140 return 0;141 }
Show My Ugly Code

 

 

 

转载于:https://www.cnblogs.com/TUncleWangT/p/7064887.html

你可能感兴趣的文章
TLS/SSL
查看>>
zoj2319Beautiful People Dp
查看>>
图片加载 背景色块问题
查看>>
Static Binding (Early Binding) vs Dynamic Binding (Late Binding)
查看>>
搭建git服务器
查看>>
iOS之UIDynamic UI动力学使用步骤
查看>>
poj 2498 动态规划
查看>>
Windows Phone 7中使用PhoneApplicationService类保存应用程序状态
查看>>
MySql数据库的下载和安装卸载
查看>>
JDBC接口核心的API
查看>>
双缓冲技术局部更新原理之派生自View
查看>>
PPAPI插件与浏览器的通信
查看>>
用 query 方法 获得xml 节点的值
查看>>
Hello,Android
查看>>
Sublime Text 3 build 3103 注册码
查看>>
删与改
查看>>
SAP 中如何寻找增强
查看>>
spi驱动无法建立spidev问题
查看>>
ANDROID开发之SQLite详解
查看>>
PHP之时间函数
查看>>