相对马高

差分数组可以解决掉,开一个数组B,初始化为0。

每次给定(a,b),B[a+1]–,B[b]++。第k匹马的高度就是h+∑i=1kB[i]h+\sum_{i=1}^kB[i]h+i=1∑k​B[i]

但是,有一些细节需要注意。

  • 确保a<b

  • 马的关系可能重复,需要去重(可以用集合set完成去重)

  • a==b忽略不处理

代码如下:

#include<bits/stdc++.h>
using namespace std;
struct node{int a,b;
};
set<node> s;
bool operator < (const node &a, const node &b){if (a.a == b.a) return a.b < b.b ;else return a.a < b.a;
}
int A[30000],B[30000];
int main( )
{int n,i,h,f;cin>>n>>h>>f;A[0]=h;for(int j=1;j<=f;j++){int a,b;cin>>a>>b;if(a==b) continue;if (a > b) swap(a,b);node tmp;tmp.a=a,tmp.b=b;s.insert(tmp);}for (set<node>::iterator i = s.begin(); i != s.end();i++){node p = *i;B[p.a + 1] -= 1;B[p.b] += 1 ;}for(int j=1;j<=n;j++){A[j]=A[j-1]+B[j];cout<<A[j]<<endl;} return 0;
}

赌石

这个题我的方法只能算到n=1000左右。。。。不过好在这题可以打表,打表部分就不介绍了,计算方法可以介绍下。

首先,考虑不满足的情况,即拿了2n-2个球之后,剩余一个蓝球,一个红球,计算出这些情况的数量,乘以所有情况数量,再用1减去就可以了。

这里先考虑所有情况数,考虑前2n-2个球的取球情况,每次可能是红可能是蓝两种,所以有 2^(2n-2) 种可能。啊,有人可能会说了,取完蓝球(或红球),后边咋取不都是红球(或蓝球)吗?哪有这么多种可能?好,实际上我们这么描述情况数确实不准确,但我们计算的是概率,提前取完的概率是较大的,我们这么处理相当于把它拆分了,实际上是等价的。举个例子,如果我有3个红球,3个蓝球,考虑剩一红一蓝的情况,这里用01区分红蓝,看0011这种情况,其概率应该是0.5 * 0.5 * 1 * 1;然后在看我说的拆分情况,不考虑球没了的情况,0011可以分为0001、0000、0010、0011,这里每种情况都有0.5 * 0.5 * 0.5 * 0.5共四种,合起来是不一样啊?好这里没问题了。

然后考虑不满足的情况,可以先把n-1个蓝球全放上去,产生了n个空,再将n-1个红球分成(1、2、3、4…n-1)个组去插这几个空隙,定义为n空插n-1(空隙无限大)为fun(n,n-1),根据排列组合,插板法分组然后再利用插空法解决,公式如下
f(n,n−1)=∑i=1n−1Cn−1iCnif(n,n-1)=\sum_{i=1}^{n-1}C_{n-1}^{i}C_{n}^{i}f(n,n−1)=i=1∑n−1​Cn−1i​Cni​
另有一个根据规律总结的式子:
f(n,0)=1f(n,0)=1f(n,0)=1
f(n,1)=nf(n,1)=nf(n,1)=n
f(n,2)=n+(n−1)+(n−2)+...+1f(n,2)=n+(n-1)+(n-2)+...+1f(n,2)=n+(n−1)+(n−2)+...+1
f(n,3)=[n+(n−1)+(n−2)+...+1]+[(n−1)+(n−2)+...+1]+...+1f(n,3)=[n+(n-1)+(n-2)+...+1]+[(n-1)+(n-2)+...+1]+...+1f(n,3)=[n+(n−1)+(n−2)+...+1]+[(n−1)+(n−2)+...+1]+...+1
.........
f(n,n−1)=f(n−1,n−1)+f(n−2,n−1)+...+f(1,n−1)f(n,n-1)=f(n-1,n-1)+f(n-2,n-1)+...+f(1,n-1)f(n,n−1)=f(n−1,n−1)+f(n−2,n−1)+...+f(1,n−1)
我是使用这个式子进行计算的,使用了记忆化的方法进行优化。

综上所述,可以得到概率为 1−f(n,n−1)22n−21-\frac{f(n,n-1)}{2^{2n-2}}1−22n−2f(n,n−1)​
特殊地,n=2和0时,概率为0,代码如下:

#include<bits/stdc++.h>
using namespace std;
double f[1251][1251];
double fun(int n,int m){if(f[n][m]!=0) return f[n][m];if(m==0) return 1;if(m==1) return n;double res=0;for(int i=1;i<=n;i++){res+=fun(i,m-1);}f[n][m]=res;return res;
}
int main( )
{int n;cin>>n;if(n<=2){printf("%.4f",0);return 0;}if(n==2000){printf("%.4lf",0.9822);return 0;}if(n==2500){printf("%.4lf",0.9840);return 0;}n=n/2;printf("%.4lf",1-fun(n,n-1)/pow(2,2*n-2)); return 0;
}

砂糖的烦恼

很简单,都保证种子有剩余了。。。

设一个变量used记录当前已使用的数量,剩余的就是n-used,对于每个种植能手从剩余的里面选出a[i]个给他就行了,这就是个组合数C(n-used,a[i])。把分配给每个人的方案数乘起来就是答案了。代码如下:

#include<bits/stdc++.h>
using namespace std;
#include<iostream>
using namespace std;
typedef long long ll;
ll C(ll n,ll m){ll ans = 1;for(ll i =1;i<=m;i++){ans = ans * (n-m+i)/i; // 注意一定要先乘再除}return ans;
}
int main()
{int n,m;cin>>n>>m;int a[m+1];for(int i=1;i<=m;i++){cin>>a[i];}int ans=1;int used=0;for(int i=1;i<=m;i++){ans*=C(n-used,a[i])%12520;used+=a[i];}printf("%d",ans);return 0;
}

求余

这个很简单,直接附代码了。

#include<bits/stdc++.h>
using namespace std;
int main( )
{int a,b,c,d;cin>>a>>b>>c>>d;printf("%d%%%d=%d\n",a,b,a%b);printf("%d%%%d=%d",c,d,c%d);return 0;
}

点与线段的关系

这个题做法很多,点斜式、直线式、线段长、叉乘等,这里4种方法我都会介绍一下,最后给个直线式的代码。

先设前两个点为A、B,第三个点为C。

线段长。 很简单,AC+BC=AB,满足这个长度关系就能说明在线段上了。

叉乘。 向量AC和向量AB的叉乘如果等于0,则说明AC和AB是平行的,再约束下横纵坐标就可以说明是在线段上了。也就是说满足下列式子:
(xc−xa)∗(ya−yb)−(xa−xb)∗(yc−ya)=0(x_{c}-x_{a})*(y_{a}-y_{b})-(x_{a}-x_{b})*(y_{c}-y{a})=0(xc​−xa​)∗(ya​−yb​)−(xa​−xb​)∗(yc​−ya)=0
min(xa,xb)<=xc<=max(xa,xb)min(x_{a},x_{b})<=x_{c}<=max(x_{a},x_{b})min(xa​,xb​)<=xc​<=max(xa​,xb​)
min(ya,yb)<=yc<=max(ya,yb)min(y_{a},y_{b})<=y_{c}<=max(y_{a},y_{b})min(ya​,yb​)<=yc​<=max(ya​,yb​)

** 点斜式 。** 知道斜率和一点,可以唯一确定一条直线。这种方法的详细过程我不展开说了,需要注意的是斜率k。 k避免直接计算值,如果直接计算值,存在精度的问题,不如表示成k=b/a的形式,注意b/a必须是最简形式不能约分,这里需要计算最大公约数gcd,使a、b均除以gcd。另外,该方法只能说明在直线上,还需要约束横坐标或者纵坐标。并且该方法不能处理垂直线,需要特判。

** 直线式。** 可以把直线的表达式转换为Ax+By+C=0的形式,这样就避免了精度问题,同时可以处理水平线和垂直线,比点斜式有很多优势。该方法同样只能说明在直线上,需要约束横坐标(纵坐标)。

A、B、C计算方法如下:
A=yb−yaA=y_{b}-y_{a}A=yb​−ya​
B=xa−xbB=x_{a}-x_{b}B=xa​−xb​
C=xb∗ya−xa∗ybC=x_{b}*y_{a}-x_{a}*y_{b}C=xb​∗ya​−xa​∗yb​

代码如下:

def main():two_point = [[int(s) for s in x.replace("(", "").replace(")","").split(",")] for x in input().split()]target_point = [int(x) for x in input().replace("(", "").replace(")","").split(",")]A=two_point[1][1]-two_point[0][1]B=two_point[0][0]-two_point[1][0]C=two_point[1][0]*two_point[0][1]-two_point[0][0]*two_point[1][1];D=target_point[0]*A+target_point[1]*B+C;if(D==0 and target_point[0]>=min(two_point[0][0],two_point[1][0]) and target_point[0]<=max(two_point[0][0],two_point[1][0]) and target_point[1]>=min(two_point[0][1],two_point[1][1]) and target_point[1]<=max(two_point[0][1],two_point[1][1])):print("YES");else:print("NO");if __name__ == '__main__':main();

百度松果人才OJ赛第一场相关推荐

  1. 第十一届蓝桥杯python试题_Python描述 第十一届蓝桥杯省赛第一场 试题 I: 字符串编码...

    试题 I: 字符串编码 时间限制: 1.0s 内存限制: 512.0MB 本题总分 25 分 [问题描述] 小明发明了一种给由全大写字母组成的字符串编码的方法.对于每一个大 写字母 小明将它转换成它在 ...

  2. 第十二届蓝桥杯大赛软件类省赛第一场 Java 大学 B 组题目蓝桥杯JavaB组大赛软件类省赛第十二届第一场

    第十二届蓝桥杯大赛软件类省赛第一场 Java 大学 B 组题目 在线看题 题目PDF下载链接 百度云 链接:https://pan.baidu.com/s/1LSZvUV5dFwNtSbOshORU1 ...

  3. J Red-Black Paths(ICPC网络赛第一场)

    J Red-Black Paths(ICPC网络赛第一场) 题意: 有n个点,m次操作,有三种操作: 1 u v:从u向v建一个有向边 2 u:将点u染成红色 3 u: 将点u染成黑色 4 查询最新生 ...

  4. Dream_Chaser队训练赛第一场 K题

    Dream_Chaser队训练赛第一场 K题 题目来自2012成都区域赛 K - Yet Another Multiple Problem Time Limit:20000MS     Memory ...

  5. Dream_Chaser队训练赛第一场 I题

    Dream_Chaser队训练赛第一场 I题 题目来自2012成都区域赛 I - Count Time Limit:1000MS     Memory Limit:32768KB     64bit ...

  6. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  7. 突击蓝桥杯嵌入式(十二)——第十二届省赛第一场真题 停车场

    突击蓝桥杯嵌入式(十二)--第十二届省赛第一场真题 停车场 一.题干 二.题目解析 所需: PA7 PWM LED(锁存器) 串口9600 LCD 按键4个,整体难在逻辑,我们先配置好硬件,进入工程 ...

  8. 突击蓝桥杯嵌入式(七)——第十三届省赛第一场真题

    突击蓝桥杯嵌入式(七)--第十三届省赛第一场真题 一.题目概览 二.思路梳理 我们直接在LCD例程的基础上,改需增加的外设如下: LED灯(配置锁存器PD2),串口(波特率9600,带中断),按键4个 ...

  9. 2021年度热身训练赛第一场

    2021年度热身训练赛第一场 A.Weird Flecks, But OK 题意 给定n个点以及n个点的三维坐标,用一根长度不限的圆柱以垂直x-y平面,x-z平面或y-z平面方式穿过所有点,求圆柱的最 ...

最新文章

  1. Matlab中的lsqcurvefit函数的使用
  2. mysql 数据库导入导出方法总结
  3. 开关怎么使用_开关也能自发电?ebelong易百珑S2自发电无线开关曝光
  4. [转]重新分配内置存储空间 android手机
  5. 电气控制原理动图22张,超赞!
  6. JVM架构和GC垃圾回收机制--面试
  7. 并发编程实战——锁分段
  8. linux十大实用工具,10大好用的Linux实用工具推荐
  9. The jar of this class file belongs to container 'JUnit 4' which does not allow ...
  10. 转载:完全卸载SQL Server 2005的方法
  11. 如何使用shell限制指定用户shell程序的网络带宽
  12. 电池SOC估计-EKF UKF
  13. 使用cocos2d-x实现一款类似《Flappy Bird》的游戏
  14. 如何解决高度塌陷【超全面】
  15. EventBus使用与分析
  16. 单周期CPU设计与实现原理分析
  17. python求四分位数的方法(附纯python写法)
  18. puzzle(018.1)数墙、留方、黑白、数方
  19. 达梦好用的监控工具 -- DEM 及配置流程
  20. python基于融合SPD-Conv改进yolov5与原生yolov5模型实践路面裂痕裂缝检测

热门文章

  1. 【与】、【或】、【异或】运算
  2. pdf.js —— 在线预览下载打印pdf文件插件,实现的两种方式
  3. 市值腰斩,三只松鼠还有未来吗?
  4. Js逆向-猿人学(1)源码混淆
  5. 计算机应用中英文缩略语,缩略语、各种缩写、术语等一般在检索工具的附录中。()...
  6. 24个SEO优化的写作技巧和写作手法
  7. 全国300城市车辆违章查询sdk分享
  8. Linux:ARM+lUbuntu16.04配置国内镜像源
  9. 高斯-勒让德求积分的Python程序
  10. C#控制CAD打印图片