标签:sed 价值 ref http mda 展开 编号 ns2 公交
自测时间:2017.4.12 8:15——11:45
实际得分:100+0+0=100
期望得分:100+100+60=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> #define mod 10007 int a,b,k,n,m,ans=1; int f[1011][1011]; using namespace std; void mul(int a,int b) { a%=mod; b%=mod; for(;b;b>>=1,a=a*a%mod) if(b&1) ans=ans*a%mod; } int main() { freopen("factor.in","r",stdin); freopen("factor.out","w",stdout); scanf("%d%d%d%d%d",&a,&b,&k,&n,&m); for(int i=1;i<=k+1;i++) f[i][0]=1; for(int i=1;i<=k+1;i++) for(int j=1;j<=m;j++) f[i][j]=(f[i-1][j]+f[i-1][j-1])%mod; mul(a,n); mul(b,m); ans=ans*f[k+1][m]%mod; printf("%d",ans); } #include<cstdio> #define mod 10007 int a,b,k,n,m,ans=1; int f[1011][1011]; using namespace std; void mul(int a,int b) { a%=mod; b%=mod; for(;b;b>>=1,a=a*a%mod) if(b&1) ans=ans*a%mod; } int main() { freopen("factor.in","r",stdin); freopen("factor.out","w",stdout); scanf("%d%d%d%d%d",&a,&b,&k,&n,&m); for(int i=1;i<=k+1;i++) f[i][0]=1; for(int i=1;i<=k+1;i++) for(int j=1;j<=m;j++) f[i][j]=(f[i-1][j]+f[i-1][j-1])%mod; mul(a,n); mul(b,m); ans=ans*f[k+1][m]%mod; printf("%d",ans); }
T2 聪明的质检员
时间限制:1 s 内存限制:128 MB
小T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi 。检验矿产的流程是:
1 、给定m 个区间[Li,Ri];
2 、选出一个参数 W;
3 、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi:
这批矿产的检验结果Y 为各个区间的检验值之和。即:Y1+Y2...+Ym
若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产。小T
不想费时间去检验另一批矿产,所以他想通过调整参数W 的值,让检验结果尽可能的靠近
标准值S,即使得S-Y 的绝对值最小。请你帮忙求出这个最小值。
输入格式:
输入文件qc.in 。
第一行包含三个整数n,m,S,分别表示矿石的个数、区间的个数和标准值。
接下来的n 行,每行2个整数,中间用空格隔开,第i+1 行表示 i 号矿石的重量 wi 和价值vi。
接下来的m 行,表示区间,每行2 个整数,中间用空格隔开,第i+n+1 行表示区间[Li,Ri]的两个端点Li 和Ri。注意:不同区间可能重合或相互重叠。
输出格式:
输出文件名为qc.out。
输出只有一行,包含一个整数,表示所求的最小值。
5 3 15 1 5 2 5 3 5 4 5 5 5 1 5 2 4 3 3
10
【输入输出样例说明】
当W 选4 的时候,三个区间上检验值分别为 20、5 、0 ,这批矿产的检验结果为 25,此
时与标准值S 相差最小为10。
【数据范围】
对于10% 的数据,有 1 ≤n ,m≤10;
对于30% 的数据,有 1 ≤n ,m≤500 ;
对于50% 的数据,有 1 ≤n ,m≤5,000;
对于70% 的数据,有 1 ≤n ,m≤10,000 ;
对于100%的数据,有 1 ≤n ,m≤200,000,0 < wi, vi≤10^6,0 < S≤10^12,1 ≤Li ≤Ri ≤n 。
检验结果随w的减小而增大,所以二分w判断检验结果与标准值的关系
#include<cmath> #include<cstdio> #include<algorithm> #define N 200001 using namespace std; int n,m,maxn; long long s,sum[N]; int w[N],v[N],a[N],b[N],tot[N]; long long check(int k) { long long tmp=0; for(int i=1;i<=n;i++) if(w[i]>=k) sum[i]=sum[i-1]+v[i],tot[i]=tot[i-1]+1; else sum[i]=sum[i-1],tot[i]=tot[i-1]; for(int i=1;i<=m;i++) tmp+=abs(sum[b[i]]-sum[a[i]-1])*(tot[b[i]]-tot[a[i]-1]); return tmp; } int main() { scanf("%d%d",&n,&m); scanf("%lld",&s); for(int i=1;i<=n;i++) scanf("%d%d",&w[i],&v[i]),maxn=max(maxn,w[i]); for(int i=1;i<=m;i++) scanf("%d%d",&a[i],&b[i]); int l=0,r=maxn,mid; long long ans1=1e15,ans2=1e15,tmp; while(l<=r) { mid=l+r>>1; tmp=check(mid); if(tmp<s) { ans1=s-tmp;r=mid-1; } else if(tmp==s) { printf("0"); return 0; } else { ans2=tmp-s; l=mid+1; } } printf("%lld",min(ans1,ans2)); }
T3 观光公交
时间限制:1 s 内存限制:128 MB
风景迷人的小城Y 市,拥有n 个美丽的景点。由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第0 分钟出现在1号景点,随后依次前往2、3、4……n 号景点。从第i 号景点开到第i+1 号景点需要Di 分钟。
任意时刻,公交车只能往前开,或在景点处等待。
设共有m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点Ai,希望乘车前往景点Bi(Ai<bi)。为了使所有乘客都能顺利到达目的地,公交车在每站都必须等待需要从该景点出发的所有乘客都上车后才能出发开往下一景点。
假设乘客上下车不需要时间。
一个乘客的旅行时间,等于他到达目的地的时刻减去他来到出发地的时刻。因为只有一辆观光车,有时候还要停下来等其他乘客,乘客们纷纷抱怨旅行时间太长了。于是聪明的司机ZZ 给公交车安装了k 个氮气加速器,每使用一个加速器,可以使其中一个Di 减1。对于同一个Di 可以重复使用加速器,但是必须保证使用后Di 大于等于0。
那么ZZ 该如何安排使用加速器,才能使所有乘客的旅行时间总和最小?
3 3 2
1 4
0 1 3
1 1 2
5 2 3
输出:10
【输入输出样例说明】
#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]=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[n]+(sum[n]-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); }
标签:sed 价值 ref http mda 展开 编号 ns2 公交
原文地址:http://www.cnblogs.com/TheRoadToTheGold/p/6700525.html