淘汰赛制是一种极其残酷的比赛制度。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[i−1][j]∗(f[i−1][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);
}
佳佳碰到了一个难题,请你来帮忙解决。 对于不定方程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();
}
物流公司要把一批货物从码头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+(i−j+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]);
}
给你一个 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宝贝儿重逢呢
从这学期开始再也别欠数学作业,从新学期开始像我同桌一样好好写英语笔记,从现在开始好好看语文老师布置的书
我爱我吒我丙我李靖夫妇我申公公我太乙真人我龙王^ _ ^国漫冲鸭