TC SRM 573
结果:过了250,challenge环节-1。 最后rate -9。第一次TC连续跌两次了,只能呵呵了主要还是250把题目看错一次,然后某SIR来个电话有事。。。然后赛后好久才知道把450看错,我以为是能到达每一个点。。不过结束之后很快把DIV2的做了。。。。DIV2 A:直接和前一个比较DIV2 B:贪心,将剩下的数排序之后。先取一个最大的,然后找到一个尽可能小的数,刚好和之前选的数相加能超过自己的得分。剩下一个数选尽可能小的。DIV2C:大致写得很随意 。枚举坐标区间大致是[-50,100],然后就是150*150枚举目标坐标。遍历所有点,每个点到目标点的步数是知道的,大概就是坐标差。然后判断是否可达一下。剩下的步数,当然是n左n右,m上m下的结构。然后统计一下每个方向有多少步,组合数搞一下就行了。要是这次做的是div2那应该爽了。。。[cpp]class WolfPackDivTwo{public:LL c[55][55];void Init(){for(int i=0;i<=50;i++){c[i][0]=c[i][i]=1;for(int j=1;j<i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD;}}LL check(vi x,vi y,int cx,int cy,int m){LL ans=1;for(int i=0;i<x.size();i++){int a=abs(x[i]-cx)+abs(y[i]-cy);if(a>m || (m-a)&1)return 0;int up=0,down=0,left=0,right=0;int k=m-a;if(x[i]>cx) left=x[i]-cx;else right=cx-x[i];if(y[i]>cy) up=y[i]-cy;else up=cy-y[i];LL t=0;for(int j=0;j*2<=k;j++){int l=left+j;int r=right+j;int u=up+(k-2*j)/2;int d=down+(k-2*j)/2;t=((((c[m][l]*c[m-l][r])%MOD)*c[m-l-r][u]%MOD)+t)%MOD;}ans=((LL)ans*t)%MOD;}return ans;}int calc(vector <int> x, vector <int> y, int m){LL ans=0;Init();for(int i=-51;i<=151;i++){for(int j=-51;j<=151;j++){ans=(ans+check(x,y,i,j,m))%MOD;}}return ans;}}class WolfPackDivTwo{public:LL c[55][55];void Init(){for(int i=0;i<=50;i++){c[i][0]=c[i][i]=1;for(int j=1;j<i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD;}}LL check(vi x,vi y,int cx,int cy,int m){LL ans=1;for(int i=0;i<x.size();i++){int a=abs(x[i]-cx)+abs(y[i]-cy);if(a>m || (m-a)&1)return 0;int up=0,down=0,left=0,right=0;int k=m-a;if(x[i]>cx) left=x[i]-cx;else right=cx-x[i];if(y[i]>cy) up=y[i]-cy;else up=cy-y[i];LL t=0;for(int j=0;j*2<=k;j++){int l=left+j;int r=right+j;int u=up+(k-2*j)/2;int d=down+(k-2*j)/2;t=((((c[m][l]*c[m-l][r])%MOD)*c[m-l-r][u]%MOD)+t)%MOD;}ans=((LL)ans*t)%MOD;}return ans;}int calc(vector <int> x, vector <int> y, int m){LL ans=0;Init();for(int i=-51;i<=151;i++){for(int j=-51;j<=151;j++){ans=(ans+check(x,y,i,j,m))%MOD;}}return ans;}}DIV1 A:大概和DIV2的B是差不多的。也是贪心,先排序之后,找一个最大的。然后再找一个尽可能小的,和之前选的相加超过自己的得分的。最后一个是在二者之前去找,如果没有说明已经找不到这样的组合了。DIV1 B:题目看错了,囧。。。。我以为是从0出发,能到达剩下N-1个点,只能呵呵了。是说怎么大家都是用从0到N-1的最短路去做。。。将高度离散化一下,dp[i][j]表示在i这个点,高度为w补充:软件开发 , C++ ,
上一个:最优流水作业调度
下一个:应用程序之间互相通讯的几种方法
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊