您的位置:首页 > 其它

NOIP2016提高组复赛

2017-08-21 19:29 148 查看
D1T1:水题

D1T2:

D1T3:换教室

D2T1:组合数问题

题解:

杨辉三角基础应用+二维差分

#include <cstdio>
using namespace std;
int c[2005][2005],g[2005][2005];
int main()
{
int T,i,j,k;
scanf("%d%d",&T,&k);
for (i=0;i<=2000;i++) c[i][0]=1;
for (i=1;i<=2000;i++)
{
for (j=1;j<=i;j++)
{
c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
if (c[i][j]==0) g[i][j]=1;
g[i][j]+=g[i-1][j]+g[i][j-1]-g[i-1][j-1];
}
g[i][i+1]=g[i][i];//求前缀和中必不可少的哦
}

while (T--)
{
int n,m;
scanf("%d%d",&n,&m);
if(m>n) m=n;
printf("%d\n",g
[m]);
}
}


D2T2:蚯蚓

很简单的75送分,用自带的priority_queue,但是这样会T

我们可以发现,如果自己建立三个单调队列,q1未切割的蚯蚓长度,q2切割后较长的蚯蚓长度,q3切割后较短的蚯蚓长度

只要把读入的数据排个序就可以发现这三个都是单调队列

那每次在队首取max,然后弹出。

#include <cstdio>
#include <queue>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 7050005
#define INF 1e9
using namespace std;
double p;
int q1
,q2
,q3
,h1,t1,h2,t2,h3,t3,qq,a[100005];
void pts75()
{
priority_queue<int>q;
int n,m,qq,u,v,t,x=1,i;
scanf("%d%d%d%d%d%d",&n,&m,&qq,&u,&v,&t);
p=(double)u/(double)v;
for (i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
q.push(a);
}
for(i=1;i<=m;i++)
{

int now=q.top(); q.pop();
int noww=now+(i-1)*qq;
if (i==x*t)
{
x++;printf("%d ",noww);
}
int a1=floor((int)noww*p),a2=noww-a1;
q.push(a1-i*qq); q.push(a2-i*qq);
}
printf("\n");
i=1;x=1;
while (!q.empty())
{
int now=q.top(); q.pop();
if (i==x*t)
{x++;printf("%d ",now+m*qq);}
i++;
}
}
int findmax(int i)
{
int a1,a2,a3;
if (h1<=t1) a1=q1[h1];else a1=-INF;
if (h2<=t2) a2=q2[h2];else a2=-INF;
if (h3<=t3) a3=q3[h3];else a3=-INF;
if (a1>=a2 && a1>=a3){h1++;return a1+i*qq;}
if (a2>=a1 && a2>=a3){h2++;return a2+i*qq;}
h3++;
return a3+i*qq;
}
int main()
{
int n,m,u,v,t,x=1,i;
scanf("%d%d%d%d%d%d",&n,&m,&qq,&u,&v,&t);
p=(double)u/(double)v;
for (i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);
for (i=n;i>=1;i--) q1[++t1]=a[i];
h1=1;h2=1;h3=1;
for(i=1;i<=m;i++)
{
int noww=findmax(i-1);
if (i==x*t){x++;printf("%d ",noww);}
int a1=floor((int)noww*p),a2=noww-a1;
q2[++t2]=max(a1,a2)-i*qq;
q3[++t3]=min(a1,a2)-i*qq;
}
printf("\n");
x=1;
for (i=1;i<=n+m;i++)
{
int noww=findmax(m);
if (i==x*t)
{x++;printf("%d ",noww);}
}
}


D2T3:愤怒的小鸟
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: