您的位置:首页 > 其它

NOIP2011 提高组 Day2

2017-04-12 18:00 302 查看
自测时间:2017.4.12 8:15——11:45

实际得分:100+0+0=100

期望得分:100+100+0=260

T2 符合要求的总价值*符合要求的总个数

写成:符合要求的总价值*区间总个数

T3 正解贪心,DP式子退错了

http://cogs.pro/cogs/page/page.php?aid=16

T1 计算系数

时间限制:1 s 内存限制:128 MB

【问题描述】
给定一个多项式 (ax+by)^k ,请求出多项式展开后 x^n*y^m 项的系数。
【输入】
输入文件名为 factor.in。
共一行,包含 5 个整数,分别为 a,b,k,n,m,每两个整数之间用一个空格隔开。
【输出】
输出文件名为 factor.out。
输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对 10007 取模后的结果

【输入输出样例】

factor.in

1 1 3 1 2

factor.out

3

【数据范围】
对于 30%的数据,有 0≤k≤10;
对于 50%的数据,有 a=1,b=1;
对于 100%的数据,有 0≤k≤1,000,0≤n,m≤k,且n+m=k,0≤a,b≤1,000,000。

递推杨辉三角

按x的指数升序排列,杨辉三角中第k+1行,m+1列为 (ax+by)^k 展开后 x^n*y^m项的系数

ans=f[k+1][m+1]*a^n*b^m

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k;
int t[10001],a[10001],b[10001],d[1001],data[1001];
int gett[1001],last[1001],sum[1001],g[1001],ans;
int main()
{
/*freopen("bus.in","r",stdin);
freopen("bus.out","w",stdout);*/
scanf("%d%d%d",&n,&m,&k);
for(int i=2;i<=n;i++) scanf("%d",&d[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&t[i],&a[i],&b[i]);
last[a[i]]=max(last[a[i]],t[i]);
sum[b[i]]++;;
}
for(int i=2;i<=n;i++) gett[i]=max(gett[i-1],last[i-1])+d[i];
//g
=n;
//for(int i=n-1;i>1;i--) g[i]= gett[i]>last[i] ? g[i+1] : i;
//for(int i=1;i<=n;i++) sum[i]+=sum[i-1];sum[n+1]=sum
+(sum
-sum[n-1]);
for(int i=1;i<=m;i++) ans+=gett[b[i]]-t[i];
while(k--)
{
int maxn=0,tmp=0;
for(int i=n;i>1;i--)
{
data[i]=sum[i];
if(last[i]<gett[i]) data[i]+=data[i+1];
}
for(int i=2;i<=n;i++)
//if(maxn<sum[g[i]+1]-sum[i]&&d[i]>0)
if(maxn<data[i]&&d[i]>0)
{
//maxn=sum[g[i]+1]-sum[i];
maxn=data[i];
tmp=i;
}
ans-=maxn;
d[tmp]--;
for(int i=tmp;i<=n/*g[tmp]*/;i++) gett[i]=max(gett[i-1],last[i-1])+d[i];
//for(int i=g[tmp];i>=tmp;i--) g[i]= gett[i]>last[i] ? g[i+1] : i;
}
printf("%d",ans);
}


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