TEST2018.4.14(Noip2011提高组Day2)

9人阅读 评论(0) 收藏 举报
分类:

TEST2018.4.14(Noip2011提高组Day2)

为2019级lizw0520zzh的学生献上福利!!!

题目描述(感谢洛谷爸爸):  计算系数    聪明的质检员    观光公交


T1 计算系数:

小学奥数!!!

学过杨辉三角的同学应该很容易推出来:

存在答案数组使得  ans[i][j]=(ans[i-1][j]*a+ans[i-1][j-1]*b);

其中ans[i][j]表示i次方的第j项的系数,故而答案就是ans[k][m+1]。

接下来就是代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define dnt long long
using namespace std;
const dnt MOD=10007;
const int N=1000+23;
dnt ans[N][N];
dnt k,m,n,a,b;

void init() {
	ans[0][1]=1;
	ans[1][1]=a;ans[1][2]=b;
	for(int i=2;i<=k;i++)
		for(int j=1;j<=i+1;j++)
			ans[i][j]=(ans[i-1][j]*a%MOD+ans[i-1][j-1]*b%MOD)%MOD;
}

int main() {
	freopen("factor.in","r",stdin);
	freopen("factor.out","w",stdout);
	cin>>a>>b>>k>>n>>m;
	init();
	cout<<ans[k][m+1]<<endl;
	return 0;
}

不开long long见祖宗!


T2 聪明的质检员:

题外话:事后看了一下洛谷的题解,发现大家都在吐槽这个质检员会不会被开除的问题QAQ(我也这么觉得)。

因为对于不同的W,存在不同的S,所以很显然可以二分答案。

即二分W的值,求出每次Y的值,直到找到两个W值 left和right 使得 Y 最接近 S 。

注意这里一定要检查 left和right 所得到 Y 值与 S 的差的绝对值谁更小(被坑了T_T)。

代码:注意check()可以有多种写法,以下为其中之一

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#define maxn 210000
using namespace std;
long long s1[maxn],s2[maxn];
int l[maxn],r[maxn];
int w[maxn],v[maxn];
int n,m;
long long S;
long long check(int x) {
    memset(s1,0,sizeof(s1));
    memset(s2,0,sizeof(s2));
    for (int i=1;i<=n;i++) {
        s1[i]=s1[i-1];s2[i]=s2[i-1];
        if (w[i]>=x) {
            s1[i]+=1;
            s2[i]+=v[i];
        }
    }
    long long res=0;
    for(int i=0;i<m;i++)
        res+=(s1[r[i]]-s1[l[i]-1])*(s2[r[i]]-s2[l[i]-1]);
    return res;
}
int main(){
    freopen("qc.in","r",stdin);
    freopen("qc.out","w",stdout);
    cin>>n>>m>>S;
    for(int i=1;i<=n;i++)
        scanf("%d%d",&w[i],&v[i]);
    for(int i=0;i<m;i++)
        scanf("%d%d",&l[i],&r[i]);
    int left=0,right=*max_element(w+1,w+n+1);
    while(left+1<right){
        int mid=(left+right)/2;
        if (check(mid)<=S)right=mid;
            else left=mid;
    }
    cout<<min(abs(check(left)-S),abs(S-check(right)));
    return 0;
}


T3 观光公交:

吐槽一波:大家看着很复杂,其实巨简单,就是贪心。但是看你贪心策略是什么了。

一开始我想的是找出每段路有几个人走过,先算出总时间,然后对走的人数最多的路进行加速(注意每段路时间不能小于零)。

然后就WA了(想爆粗)。

于是考完试后照例经典算法:百度搜索了一波,发现是贪心策略有错。

正确思路大家可以参照以下网址,在此不加以赘述:

pascal语言(看思路就行)          C++(代码实现)

本人使用第二种方法依葫芦画瓢写了一下,结果在累加距离时加错了,改了好久【我们的同学,一定要细心啊(强行学老李口气)】。

代码【史上最简单写法(有点小夸张)】:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1000+233;
int n,m,k,ans=0;
int arrive[N],leave[N],off[N],d[N],sum[N];
int main() {
    //freopen("bus.in","r",stdin);
    //freopen("bus.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<n;i++) scanf("%d",d+i);
    for(int i=1,a,b,t;i<=m;i++) scanf("%d%d%d",&t,&a,&b),off[b]++,leave[a]=max(leave[a],t),ans-=t;
    int now,use;
    while(k) {
        for(int i=1;i<=n;i++) arrive[i]=max(arrive[i-1],leave[i-1])+d[i-1];
        now=0;
        for(int i=n;i>1;i--)
            if(!d[i-1]) sum[i-1]=0;
            else {sum[i-1]=off[i];if(arrive[i]>leave[i]) sum[i-1]+=sum[i];}
        for(int i=1;i<n;i++)
            if(now<sum[i]) now=sum[i],use=i;
        if(!now) break;
        d[use]--;k--;
    }
    for(int i=1;i<=n;i++) arrive[i]=max(arrive[i-1],leave[i-1])+d[i-1];
    for(int i=1;i<=n;i++) ans+=arrive[i]*off[i];
    printf("%d",ans);
    return 0;
}


那么题解到此结束了!祝大家早日AK(完结撒花)。

查看评论

如何获取屏幕保护程序的密码

  大家都知道,WINDOWS9X只是一个桌面操作系统,它的稳定性和保密性一直受大家的批评。现在,我就通过介绍提取WINDOWS98的屏幕保护程序的密码的算法来说明WINDOWS98的保密性是怎样的差...
  • qutemouse
  • qutemouse
  • 2000-12-05 12:02:00
  • 1112

NOIP2011提高组 DAY2 题解&总结

考试时的心态:   这次离线赛考的是NOIP2011,考得比较差,其实试卷比较水,水出新高度了。但是就考了160分,还是因为大意了,说实话,我一直在想第二题那个Sigma 是怎么计算的,很虚。虽然最...
  • ShimaKZ
  • ShimaKZ
  • 2017-10-18 15:49:43
  • 161

NOIP 2011 提高组 复赛 day2 factor 计算系数

NOIP 2011 提高组 复赛 day2 factor 计算系数 1.只看标题,就可以猜到,这是一个数学题。 2.准备好稿纸,一看,学过的二项式定理用上了,系数C(k,n)*a^n*b^m。 3.本...
  • mrcrack
  • mrcrack
  • 2017-01-12 09:36:41
  • 352

noip2011提高组——计算系数

这个题第一眼  杨辉三角。。其实还有个高大上的名字 叫。。二项式定理   我才高一QAQ  后面这个名字不知道啊 不过知道杨辉三角也够了 1                 -> 1a^0*b^0 ...
  • leijp1430
  • leijp1430
  • 2015-02-08 10:14:46
  • 938

NOIP2011提高组Day2

NOIP2011提高组Day2一、计算系数数据:对于50%,a=b=1 对于100%,k∈[0,1000], n,m∈[0,k],且n+m=k,a,b∈[1,1e6]a=b=1时就是杨辉三角。k又...
  • qq_39951289
  • qq_39951289
  • 2017-10-18 09:20:49
  • 123

NOIP2011提高组解析

题目描述: 铺地毯  选择客栈  Mayan游戏 计算系数 聪明的质检员 观光公交 day1: 铺地毯: 只有一个需要注意的地方:给出的g和k不是右下角的坐标,右下角坐标应是(a+g,...
  • no1_terminator
  • no1_terminator
  • 2016-09-21 12:57:49
  • 1325

NOIP2011复赛提高组测试数据

  • 2013年11月07日 14:18
  • 8.14MB
  • 下载

noip2011提高组测试数据

  • 2011年11月24日 19:27
  • 18.61MB
  • 下载

noip2011提高组复赛试题

  • 2011年11月20日 13:15
  • 241KB
  • 下载

【NOIP2011】聪明的质检员

2.聪明的质监员 (qc.cpp/c/pas) 小 T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1 到 n 逐一编号,每个矿石都有自己的重量 wi 以及价值 ...
  • qq_35479641
  • qq_35479641
  • 2016-09-19 22:28:58
  • 1039
    个人资料
    等级:
    访问量: 16
    积分: 20
    排名: 220万+
    文章存档