2019.08.23【NOIP提高组】模拟 B 组 DP+快速幂、数论+最短路、DP+二分、二维树状数组

文章目录

  • 0 淘汰赛制
  • 1 方程的解
  • 2 物流运输
  • 3 矩阵乘法(mat)
  • 我和我的400宝贝儿

0 淘汰赛制

淘汰赛制是一种极其残酷的比赛制度。2n名选手分别标号1,2,3,……2n-1,2^n,他们将要参加n轮的激烈角逐。每一轮中,将所有参加该轮的选手按标号从小到大排序后,第1位与第2位比赛,第3位与第4位比赛,第5位与第6位比赛……只有每场比赛的胜者才有机会参加下一轮的比赛(不会有平局)。这样,每轮将淘汰一半的选手。n轮过后,只剩下一名选手,该选手即为最终的冠军。

现在已知每位选手分别与其他选手比赛获胜的概率,请你预测一下谁夺冠的概率最大。
  
  30%的数据满足n<=3

100%的数据满足n<=10


DP快乐

用f[i][j]表示第i轮比赛,j位选手获胜的概率
转移有
f [ i ] [ j ] = f [ i − 1 ] [ j ] ∗ ( f [ i − 1 ] [ k ] ∗ a [ j ] [ k ] ) f[i][j]=f[i-1][j]*(f[i-1][k]*a[j][k]) f[i][j]=f[i1][j](f[i1][k]a[j][k])

观察一个选手在某一轮中可能对战的选手,确定k的值

#include 

using namespace std;

int n,m,s,d=1;
double f[15][1050],a[1050][1050],ans;

int cd(int x){
	return (x-1)/d+1;
}

int main(){
	scanf("%d",&n);
	m=1;
	for (int i=1;i<=n;i++) m*=2;
	for (int i=1;i<=m;i++){
		f[0][i]=1;
		for (int j=1;j<=m;j++){
			int d;
			scanf("%d",&d);
			a[i][j]=d;
			double c=100;
			a[i][j]=a[i][j]/c;
		}
	}
	for (int i=1;i<=n;i++){
		for (int j=1;j<=m;j++){
			f[i][j]=f[i-1][j];
			double l=0;
			int t=cd(j);
			if (t&1) t+=1;else t-=1;
			for (int k=1;k<=m;k++)
				if (cd(k)==t)
					l+=f[i-1][k]*a[j][k];
			f[i][j]*=l;
		}
		d*=2;
	}
	for (int i=1;i<=m;i++)
	if (f[n][i]>ans){
		ans=f[n][i];s=i;
	}
	printf("%d",s);
}

1 方程的解

佳佳碰到了一个难题,请你来帮忙解决。   对于不定方程a1+a2+……+ak-1+ak=g(x),其中k>=2且k∈N*,x是正整数,g(x)=x^x mod 1000(即xx除以1000的余数),x,k是给定的数。我们要求的是这个不定方程的正整数解组数。   举例来说,当k=3,x=2时,分别为(a1,a2,a3)=(2,1,1),(1,2,1),(1,1,2).

对于40%的数据,ans<=10^16; 对于100%的数据,k<=100,x<=2^31-1,k<=g(x)。


g(x)好求,随便快速幂

但是我当时就是没想到怎么求方案[我明白了我就是很菜我这就去办退学手续.jpg]


可发现这个方案数相当于求C(g(x)-1,k-1),随便用组合数学想想(隔板法?反正我想这个想明白)

然后组合数呢可以约分化简,分解质因数,加加减减次方,再把次方高精度乘起来

#include 

using namespace std;

const int N=1000;
int k,x,l[1000];
int a[1000],p[1000],bz[1000];

void ksm(){
	int y=x%1000,b=x;
	x=1;
	while (b){
		if (b&1) x=(x*y)%1000;
		y=(y*y)%1000;
		b>>=1;
	}
}

void pi(){
	for (int i=2;i<=1000;i++){
		if (bz[i]==0){
			p[++p[0]]=i;
		}
		for (int j=1;j<=p[0]&&p[j]*i<=1000;j++){
			bz[p[j]*i]=1;
			if (i%p[j]==0) break;
		}
	}
}

void pri(int x,int b){
	for (int i=1;i<=p[0];i++)
	if (x<=1)break;else{
		int k=0;
		while (x%p[i]==0&&x>0){
			x/=p[i];
			k++;
		}
		l[i]+=k*b;
	}
}

void cd(int x){
	int g=0;
	for (int i=1;i<=a[0];i++){
		a[i]=a[i]*x+g;
		g=a[i]/N;
		a[i]%=N;
		if (i==a[0]&&g>0) ++a[0];
	}
}

void plus(){
	a[1]=1,a[0]=1;
	int k=1;
	for (int i=1;i<=p[0];i++)
	if (l[i]){
		while (l[i]){
			k*=p[i];
			if (k>=N) cd(k),k=1;
			--l[i];
		}
	}
	cd(k);
}

void print(){
	printf("%d",a[a[0]]);
	for (int i=a[0]-1;i>=1;i--)
	printf("%03d",a[i]);
}

int main(){
	scanf("%d%d",&k,&x); 
	ksm();
	pi();
	for (int i=2;i<=k-1;i++) pri(i,-1);
	for (int i=x-k+1;i<=x-1;i++) pri(i,1);
	plus();
	print();
}

2 物流运输

物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是修改路线是一件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小。

n( 1 <= n <= 100 )、m( 1 <= m<= 20 )


就是个DP呢

f [ i ] f[i] f[i]表示第i天的最小成本
f [ i ] = m i n ( f [ j ] + k + ( i − j + 1 ) ∗ a [ 1 ] [ m ] ) f[i]=min(f[j]+k+(i-j+1)*a[1][m]) f[i]=min(f[j]+k+(ij+1)a[1][m])其中a[1][m]是去掉i到j天不能走的码头后的最短路

最短路当然可以每次求啦,20的小数据用什么最短路都可以呢

#include 
#include 

using namespace std;

int n,m,k;
int a[25][25],g[25][25],p[25][105];
int f[105],b[25];

void read(){
	int e,d;
	scanf("%d%d%d%d",&n,&m,&k,&e);
	memset(a,0x3f,sizeof a);
	for (int i=1;i<=e;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		a[x][y]=a[y][x]=(z=1;j--){
			for (int l=1;l<=m;l++)
			if (p[l][j]==1) b[l]=1;
			memcpy(a,g,sizeof a);
			floyed();
			if (a[1][m]==a[0][0]) break;
			f[i]=(f[i]>f[j-1]+k+(i-j+1)*a[1][m]?f[j-1]+k+(i-j+1)*a[1][m]:f[i]);
		}
		memcpy(a,g,sizeof a);
	}
}

int main(){
	read();
	dp();
	printf("%d",f[n]);
}

3 矩阵乘法(mat)

给你一个 N*N 的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第 K 小数。

矩阵中数字是 10 ^ 9 以内的非负整数;

20% 的数据: N<=100,Q<=1000 ;

40% 的数据: N<=300,Q<=10000 ;

60% 的数据: N<=400,Q<=30000 ;

100% 的数据: N<=500,Q<=60000 。


整体二分,二维树状数组

我和我的400宝贝儿

听说复旦交大清北什么的裸分的话三总必须400+呢。。。

看着我可怜的分数流下了悔恨的泪水。。。

假如我好好努力是不是可以和我家400宝贝儿重逢呢
从这学期开始再也别欠数学作业,从新学期开始像我同桌一样好好写英语笔记,从现在开始好好看语文老师布置的书


我爱我吒我丙我李靖夫妇我申公公我太乙真人我龙王^ _ ^国漫冲鸭

你可能感兴趣的:(未完成,最短路,高精度)