又是一个二模02,不过day2

话说比较简单.除了第三题不会写平衡树啊你妹!!边做边写吧.

机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~

仍然是机智的链接链接:http://pan.baidu.com/s/1bn6I14N 密码:pmsa

第一题:

题目的数据范围非常小,来个 大法狮 吧.$6^6$只有$46656$,加上浮点运算的超大常数也不多嘛 ╮(╯_╰)╭

实现有点恶心,暴力你懂得.

#include <cstdio>
#include <cmath>
#define PI 3.1415926535897932384626
inline double ab(double x){
	return (((x)>=0)?(x):(-x));
}
inline double mi(double x,double y){
	y=ab(y);
	return (x<y?x:y);
}
inline double ma(double x,double y){
	y=ab(y);
	return (x>y?x:y);
}
int n;
double x[8],y[8],r[8],s[8],minLeft;
bool f[8];
void dfs(int p,int d,double si){
	double a,b,c;
	int i;
	b=ab(x[p]-x[0]);
	b=mi(b,x[p]-x[1]);
	b=mi(b,y[p]-y[1]);
	b=mi(b,y[p]-y[0]);
	for(i=2;i<=n;++i){
		if(f[i]) b=mi(b,hypot(x[p]-x[i],y[p]-y[i])-r[i]);
	}
	f[p]=true;
	si+=PI*b*b;
	r[p]=b;
	if(d==n-1){
		si=s[0]-si;
		if(si<minLeft){
			minLeft=si;
		}
		r[p]=0.0;
		f[p]=false;
		return;
	}
	for(i=2;i<=n;++i){
		if(!f[i]){
			dfs(i,d+1,si);
		}
	}
	r[p]=0.0;
	f[p]=false;
}
int main(){
	freopen("box2.in","r",stdin);
	freopen("box2.out","w",stdout);
	scanf("%d%lf%lf%lf%lf",&n,x,y,x+1,y+1);
	minLeft=s[0]=s[1]=ab((x[1]-x[0])*(y[1]-y[0]));
	++n;
	int i;
	for(i=2;i<=n;++i) scanf("%lf%lf",x+i,y+i);
	for(i=2;i<=n;++i){
		dfs(i,1,0.0);
	}
	printf("%.0lf",minLeft);
	return 0;
}

[email protected][email protected]@[email protected]!##@@#@[email protected]##@@@#@#%^&^%##@[email protected]@我是机智的分割线~~~

第二题:

简单的动规.DP方程:

DP F[i,j]=max(F[i-1,j]+same(c[i],i-j),F[i-1,j-1])# F[i,j]表示前i个数删去j个的最大匹配数,c[i]表示第i个数字# same(a,b)=(a==b?1:0)return MaxAmong(F,lengthof F)
#include <cstdio>
int f[2000][2000],c[2000],n,i,j;
inline int max(int a,int b){
	return a>b?a:b;
}
int main(){
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i){
		scanf("%d",c+i);
	}
	for(i=1;i<=n;++i){
		for(j=0;j<=i;++j){
			f[i][j]=max(f[i-1][j]+(c[i]==i-j),f[i-1][j-1]);
		}
	}
	j=0;
	for(i=0;i<=n;++i){
		if(f[n][i]>j) j=f[n][i];
	}
	printf("%d\n",j);
	return 0;
}

真的很 短啊.

第三题:

不会写BST啊神犇滚粗!!!

好吧今天边学习边写,应该SBT比较方便实现吧.

时间: 2024-10-05 18:26:55

又是一个二模02,不过day2的相关文章

二模 (16) day1&amp;day2

第一题:题目大意: 数列a[0]=a[1]=1, a[n]=a[n-2]*a[n-1]*n,求a[n]的因子个数 mod 1000000007.  n<=1000000 解题过程: 1.递推式还真没想出来,就记录每个a[i]的分解质因数的结果,然后转移质因子的个数.可以拿到30分. 2.思路:计算a[i]的时候,a[i]=a[i-2]*a[i-1]*i.  追踪这个i,它到a[i+1]里的时候是一个i,到a[i+2]里的时候是2个i,到a[i+3]里的时候是3个i,到a[i+4]里的时候是5个i

二模 (8) day2

第一题: 题目描述: 有 n 个炸弹,有些炸弹牵了一根单向引线(也就是说引线只有在这一端能被炸弹点燃),只要引爆了这个炸弹,用引线连接的下一个炸弹也会爆炸.每个炸弹还有个得分,当这个炸弹被引爆后就能得到相应得分.现在要你引爆 k 个炸弹,使得得分最大. 解题过程: 1.一开始想到算出每个入度为0的点打掉之后的得分,然后做个堆,从大到小打,但是路径会有重叠的情况,也就是说打掉一条路径后可能会导致另外一条路径的权值发生变化.. 2.然后听到YYL大神一直在说2次BFS,就想到可以倒着来做..从出度为

new一个二维数组(转)

转自:http://www.cnblogs.com/irvinow/archive/2009/02/21/1395340.html 定义二维数组char array[x][y]; 1.只定义个一维的就可以了 char *array; array = new char[x*y]; 访问的时候*(array+i*y+j)表示array[i][j] 2.定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;i<x;++i) array1[i] =

返回一个集合对象,同时这个集合的对象的属性又是一个集合对象的处理方法(ViewModel)

如果遇到需要返回一个集合对象,其中该集合中的属性又是一个集合.第一种:可在考虑用外键关联,比如在控制器中可以采用预先加载的方式加载关联的数据,比如 RoleManager.Roles.Include<x =>r.Users>.ToList(); 第二种 可以考虑使用视图模型ViewModel的方式.第二种方式的适用范围更加广泛,第一种方式使用较为简单,但使用的场合有限. 一.建立视图模型 ViewModel public class IndexRoleViewModel { public

2019渐渐走到终点,又是一个总结与展望的时刻

2019渐渐走到终点,又是一个总结与展望的时刻. 入行多年,一路走来看到身边的产品经理们一直有各种各样的迷茫,特写一篇修炼指南,为大家2020年的修炼提供一些参考. 你是不是也有过这样的困惑: 程序猿们说“这需求技术上做不了”,咋办?另外感觉他们的估时好像特不靠谱,可我刚张嘴他们就说“U can U up”,秒怂……四面八方的业务需求提过来,说得天花乱坠,怎么知道做出来有没有用?有的业务一拒绝就吵,还找领导,怎么办?有些需求完全不符合我的产品原则,比如到处挖坑塞广告位加营销资源位,但业务说是为了

结对开发之返回一个二维整数数组中最大联通子数组的和

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

返回一个二维整数数组中最大联通子数组的和

题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选).源代码.结果截图.总结. 思想: 在看到本题目后,想了很久也没有想到比较满意的解决方法,觉得题目比较难,超出了我的能力范围.不过,个人认为可能用到了图论的知识,但是学的不好.根据上图给定的二维数组求解最大联通数组也许比较简单.以一个非负

返回一个二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 方法一:首先若要对二维数组进行分析,之前我们已经做过关于一位数组的练习,所以我们可以把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的结果就是最大联通子数组的和