考前模拟冲刺2

1. 足球联赛
(soccer.pas/c/cpp )

题目描述:

巴蜀中学新一季的足球联赛开幕了。足球联赛有 n只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得 3 分,输一场不得分,平局两只队伍各得一分。

英勇无畏的小鸿是机房的主力前锋,她总能在关键时刻踢出一些匪夷所思的妙球。但是很可惜,她过早的燃烧完了她的职业生涯,不过作为一个能够 Burning 的 girl,她的能力不止如此,她还能预测这个赛季所有球队的比赛结果。

虽然她能准确预测所有比赛的结果,但是其实她不怎么厉害,Mr.Gao 上数学课时她总是在 sleep,因此她的脑里只有整数没有实数,而且,她只会 10 以内非负整数的加法运算,因此她只有结果却无法知道谁会获得联赛的冠军。

小鸿想给冠军队伍的所有队员一个拥抱,所以她把计算结果的任务交给了你:现在,给你一个 n*n 的矩阵表示比赛情况。第 i 行第 j 列的字母表示在第 i 只队伍 在主场迎战第 j 只队伍的比赛情况,W 表示主队赢,L 表示主队输,D 表示平局。现在需要你给出最后能得到小鸿拥抱的队伍编号,如有多支队伍分数最高,按字典序输出编号。

输入格式:

第一行一个整数 n。
接下来 n 行,每行 n 个字符,表示输赢情况。第 i 行第 i 列为 - ,因为一只队伍不可能与自己比赛。

输出格式:

输出得分最高的队伍编号。如有多个在一行中输出,用一个空格分开。

样例输入:

  样例1

3
-WW
W-W
WW-

  样例2

5
-DWWD
L-WLL
DD-WD
DDL-L
DDLL- 

样例输出:

  样例1

123

  样例2

1

数据范围:

对于 40%的数据,满足 N<=20
对于 100%的数据,满足 N<=50

思路:暴力即可,水题。但是没有注意胜利是加3分,所以gg了┭┮﹏┭┮,下次要细心啊!!

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
char s[60];
struct nond{
    int num,id;
}v[60];
int cmp(nond a,nond b){
    if(a.num==b.num)    return a.id<b.id;
    return a.num>b.num;
}
int main(){
    freopen("soccer.in","r",stdin);
    freopen("soccer.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%s",s+1);
        v[i].id=i;
        for(int j=1;j<=n;j++){
            if(s[j]==‘D‘){ v[i].num+=1;v[j].num+=1; }
            else if(s[j]==‘W‘){ v[i].num+=3; }
            else if(s[j]==‘L‘){ v[j].num+=3; }
        }
    }
    sort(v+1,v+1+n,cmp);
    for(int i=1;i<=n;i++)
        if(v[i].num==v[1].num)    cout<<v[i].id<<" ";
    return 0;
}

2. 最短路径
(paths.pas/c/cpp )

题目描述:

平面内给出 n 个点,记横坐标最小的点为 A,最大的点为 B,现在小 Y 想要知道在
每个点经过一次(A 点两次)的情况下从 A 走到 B,再回到 A 的最短路径。但他是个强
迫症患者,他有许多奇奇怪怪的要求与限制条件:
1.从 A 走到 B 时,只能由横坐标小的点走到大的点。
2.由 B 回到 A 时,只能由横坐标大的点走到小的点。
3.有两个特殊点 b1 和 b2, b1 在 0 到 n-1 的路上,b2 在 n-1 到 0 的路上。
请你帮他解决这个问题助他治疗吧!

输入格式:

 第一行三个整数 n,b1,b2,( 0 < b1,b2 < n-1 且 b1 <> b2)。n 表示点数,从 0 到 n-1 编号,b1 和 b2 为两个特殊点的编号。
    以下 n 行,每行两个整数 x、y 表示该点的坐标(0 <= x,y <= 2000),从 0 号点顺序给出。Doctor Gao 为了方便他的治疗,已经将给出的点按 x 增序排好了。

输出格式:

输出仅一行,即最短路径长度(精确到小数点后面 2 位)

样例输入:

5 1 3
1 3
3 4
4 1
7 5
8 3

样例输出:

18.18

样例解释:

最短路径:0->1->4->3->2->0

数据范围:

20%的数据 n<=20
60%的数据 n<=300
100%的数据 n<=1000
对于所有数据 x,y,b1,b2 如题目描述.

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 1001
using namespace std;
int n,b1,b2;
struct nond{
    int x,y;
}cnt[MAXN];
int vis[MAXN];
double bns,ans=0x7f7f7f7f;
double dis[MAXN][MAXN];
void slove(){
    int pre=1;bns=0;
    for(int i=pre+1;i<=n;i++)
        if(!vis[i]||i==n){
            bns+=dis[pre][i];
            pre=i;
        }
}
void dfs(double sum,int pre){
    if(vis[b2])    return ;
    if(pre>b1&&!vis[b1])    return ;
    if(pre==n){
        if(!vis[1]||!vis[b1]||vis[b2]==1||!vis[n])    return ;
        slove();
        ans=min(sum+bns,ans);
        return ;
    }
    for(int i=pre+1;i<=n;i++)
        if(!vis[i]){
            vis[i]=1;
            dfs(sum+dis[pre][i],i);
            vis[i]=0;
        }
}
int main(){
    freopen("paths.in","r",stdin);
    freopen("paths.out","w",stdout);
    scanf("%d%d%d",&n,&b1,&b2);b1+=1;b2+=1;
    for(int i=1;i<=n;i++)
        scanf("%d%d",&cnt[i].x,&cnt[i].y);
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            dis[i][j]=dis[j][i]=sqrt((cnt[i].x-cnt[j].x)*(cnt[i].x-cnt[j].x)+(cnt[i].y-cnt[j].y)*(cnt[i].y-cnt[j].y));
    dfs(0,0);
    printf("%.2lf",ans);
}

20分的暴力

正解思路:动态规划

(定义dis[i][j]表示点i到点j之间的直线距离)把问题简化 后可以发现,问题其实可以看成这样一个问题:平面上n个点,确定一条连接各点的最短闭合旅程,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。然后不妨把问题中从n到1路线看成是从1到n的路线,这样我们就有了两条从1到n的路线。
定义f[i][j]表示从点i到点j的路径,理解为:从点i开始,从右到左一直到点1,然后从左到右一直到点j。在这个路径上,会经过点1到点max(i,j)之间的所有点且只经过一次。可以列出状态转移方程为:定义k为max(i,j)+1;f[1][1]=0;f[i][k]=min(f[i][k],f[i][j]+dis[j][k]);f[k][j]=min(f[k][j],f[i][j]+dis[i][k]);还要考虑一些特殊情况,比如:  点b1,b2。  还有k=max(i,j)+1;(i==n||j==n)的情况。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 1001
using namespace std;
int n,b1,b2;
struct nond{
    int x,y;
}cnt[MAXN];
double dis[MAXN][MAXN],f[MAXN][MAXN];
int main(){
    freopen("paths.in","r",stdin);
    freopen("paths.out","w",stdout);
    scanf("%d%d%d",&n,&b1,&b2);b1+=1;b2+=1;
    for(int i=1;i<=n;i++)
        scanf("%d%d",&cnt[i].x,&cnt[i].y);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            dis[i][j]=dis[j][i]=sqrt((cnt[i].x-cnt[j].x)*(cnt[i].x-cnt[j].x)+(cnt[i].y-cnt[j].y)*(cnt[i].y-cnt[j].y));
    memset(f,0x7f,sizeof(f));
    f[1][1]=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i!=j||i==1){
                int k=max(i,j)+1;
                if(k-1==n){
                    if(i!=n)    f[n][n]=min(f[n][n],f[i][j]+dis[i][n]);
                    if(j!=n)    f[n][n]=min(f[n][n],f[i][j]+dis[j][n]);
                    continue;
                }
                if(k!=b1)    f[i][k]=min(f[i][k],f[i][j]+dis[j][k]);
                if(k!=b2)    f[k][j]=min(f[k][j],f[i][j]+dis[i][k]);
            }
    printf("%.2lf",f[n][n]);
}

3.阿 Q 的停车场
(park.pas/c/cpp )

题目描述:

刚拿到驾照的 KJ 总喜欢开着车到处兜风,玩完了再把车停到阿 Q 的停车场里,虽然她对自己停车的水平很有信心,但她还是不放心其他人的停车水平,尤其是 Kelukin。于是,她每次都把自己的爱车停在距离其它车最远的一个车位。KJ 觉得自己这样的策略非常科学,于是她开始想:在一个停车场中有一排车位,从左到右编号为 1 到 n,初始时全部是空的。有若干汽车,进出停车场共 m 次。对于每辆进入停车场的汽车,会选择与其它车距离最小值最大的一个车位,若有多个符合条件,选择最左边一个。KJ 想着想着就睡着了,在她一旁的 Kelukin 想帮她完成这个心愿,但是他又非常的懒,不愿意自己动手,于是就把这个问题就留给了你:在 KJ 理想的阿 Q 的停车场中,给你车辆进出的操作序列,依次输出每辆车的车位编号。

输入格式:

第一行,两个整数 n 和 m,表示停车场大小和操作数;
接下来 m 行,每行两个整数 F 和 x
F 是 1 表示编号为 x 的车进停车场;
F 是 2 表示编号为 x 的车出停车场;
保证操作合法,即:
出停车场的车一定目前仍在停车场里;
停车场内的车不会超过 n;

输出格式:

对于所有操作 1,输出一个整数,表示该车车位的编号。

样例输入:

7 11
1 15
1 123123
1 3
1 5
2 123123
2 15
1 21
2 3
1 6
1 7
1 8

样例输出:

1
7
4
2
7
4
1
3

数据范围:

对 30%的数据 n<=1000 ,m<=1000
对 60%的数据 n<=200000,m<=2000
对 100%的数据 n,m<=200000,车的编号小于等于 10^6

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 200010
using namespace std;
map<int,int>ma;
int n,m,tot;
int vis[MAXN],stop[MAXN];
struct nond{
    int now,l,r;
    int len,ren,sum;
    int ll,rr,sum1,sum2;
}tree[MAXN*4];
void up(int now){
//    if(tree[now*2].l==1)
    if(tree[now*2].sum>=tree[now*2+1].sum)
        tree[now].sum=tree[now*2].sum,tree[now].sum1=tree[now*2].sum1,tree[now].sum2=tree[now*2].sum2;
    else
        tree[now].sum=tree[now*2+1].sum,tree[now].sum1=tree[now*2+1].sum1,tree[now].sum2=tree[now*2+1].sum2;
    if(tree[now*2].ren+tree[now*2+1].len>tree[now].sum)
        tree[now].sum=tree[now*2].ren+tree[now*2+1].len,tree[now].sum1=tree[now*2].rr,tree[now].sum2=tree[now*2+1].ll;
    else if(tree[now*2].ren+tree[now*2+1].len==tree[now].sum)
        if(tree[now*2].rr<tree[now].sum1&&tree[now*2].rr!=0)
            tree[now].sum1=tree[now*2].rr,tree[now].sum2=tree[now*2+1].ll;
    tree[now].len=tree[now*2].len;
    tree[now].ll=tree[now*2].ll;
    tree[now].ren=tree[now*2+1].ren;
    tree[now].rr=tree[now*2+1].rr;
    if(tree[now].ll>=tree[now].sum1&&tree[now].sum2>=tree[now].rr){
        tree[now].sum=tree[now].len=tree[now].ren=tree[now].r-tree[now].l+1;
        tree[now].ll=tree[now].sum2=tree[now].r;
        tree[now].rr=tree[now].sum1=tree[now].l;
    }
    else if(tree[now].ll>=tree[now].sum1){
        tree[now].sum=tree[now].len=tree[now].sum2-tree[now].l+1;
        tree[now].sum1=tree[now].l;
        tree[now].ll=tree[now].sum2;
    }
    else if(tree[now].sum2>=tree[now].rr){
        tree[now].sum=tree[now].ren=tree[now].r-tree[now].sum1+1;
        tree[now].sum2=tree[now].r;
        tree[now].rr=tree[now].sum1;
    }
}
void build(int now,int l,int r){
    tree[now].l=l;
    tree[now].r=r;
    if(tree[now].l==tree[now].r){
        tree[now].len=1;
        tree[now].ren=1;
        tree[now].sum=1;
        tree[now].ll=tree[now].r;
        tree[now].rr=tree[now].l;
        tree[now].sum1=tree[now].l;
        tree[now].sum2=tree[now].r;
        return ;
    }
    int mid=(tree[now].l+tree[now].r)/2;
    build(now*2,l,mid);
    build(now*2+1,mid+1,r);
    up(now);
}
void change(int now,int x,int k){
    if(tree[now].l==tree[now].r){
        if(k==1){
            tree[now].ll=0;
            tree[now].rr=0;
            tree[now].sum1=0;
            tree[now].sum2=0;
            tree[now].sum=0;
            tree[now].len=0;
            tree[now].ren=0;
        }
        if(k==0){
            tree[now].sum=1;
            tree[now].len=1;
            tree[now].ren=1;
            tree[now].ll=tree[now].r;
            tree[now].rr=tree[now].l;
            tree[now].sum1=tree[now].l;
            tree[now].sum2=tree[now].r;
        }
        return ;
    }
    int mid=(tree[now].l+tree[now].r)/2;
    if(x<=mid)    change(now*2,x,k);
    else if(x>mid)    change(now*2+1,x,k);
    up(now);
}
int main(){
    freopen("park.in","r",stdin);
    freopen("park.out","w",stdout);
    scanf("%d%d",&n,&m);
    if(n<=1000&&m<=1000){
        for(int i=1;i<=m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            if(x==1){
                ma[y]=++tot;
                int len=0,pos,maxn=-1,l;
                for(int j=1;j<=n;j++){
                    if(!vis[j])    len++;
                    else{
                        if(len==0)    continue;
                        if(j-len==1){ maxn=len-1;l=len;pos=1; }
                        else{
                            int k=(len-1)/2;
                            if(k>maxn){ maxn=k;l=len;pos=j-len; }
                        }

                        len=0;
                    }
                }
                if((len-1)/2>maxn){ maxn=(len-1)/2;l=len;pos=n-len+1; }
                int last=pos+l-1,mid=(pos+last)/2;
                if(pos==1)    vis[pos]=1,stop[tot]=pos,cout<<pos<<endl;
                else if(last==n)    vis[last]=1,stop[tot]=last,cout<<last<<endl;
                else if(pos!=1&&last!=n)    vis[mid]=1,stop[tot]=mid,cout<<mid<<endl;
            }
            if(x==2)    vis[stop[ma[y]]]=0;
        }
    }
    else if(n<=200000&&m<=2000){
        build(1,1,n);
        for(int i=1;i<=m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            if(x==1){
                ma[y]=++tot;
                int len=0,pos=0;
                if(tree[1].len)
                    len=tree[1].len,pos=1;
                if(tree[1].ren>len)
                    len=tree[1].ren,pos=tree[1].r;
                if((tree[1].sum-1)/2>len)
                    len=tree[1].sum,pos=(tree[1].sum2-tree[1].sum1)/2;
                change(1,pos,1);
                stop[tot]=pos;
                cout<<pos<<endl;
            }
            else    change(1,stop[ma[y]],0);
        }
    }
}

10分的暴力

/*
维护的区间中间最长的
区间从左边开始向右能拓展到的最长的。
区间从右边开始向左能拓展到的最长的。
然后没有调出来处理。
*/
#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 200010
using namespace std;
map<int,int>ma;
int n,m,tot;
int vis[MAXN],stop[MAXN];
struct nond{
    int now,l,r;
    int len,ren,sum;
    int ll,rr,sum1,sum2;
}tree[MAXN*4];
void up(int now){
    if(tree[now*2].sum>=tree[now*2+1].sum)
        tree[now].sum=tree[now*2].sum,tree[now].sum1=tree[now*2].sum1,tree[now].sum2=tree[now*2].sum2;
    else
        tree[now].sum=tree[now*2+1].sum,tree[now].sum1=tree[now*2+1].sum1,tree[now].sum2=tree[now*2+1].sum2;
    if(tree[now*2].ren+tree[now*2+1].len>tree[now].sum)
        tree[now].sum=tree[now*2].ren+tree[now*2+1].len,tree[now].sum1=tree[now*2].rr,tree[now].sum2=tree[now*2+1].ll;
    else if(tree[now*2].ren+tree[now*2+1].len==tree[now].sum)
        if(tree[now*2].rr<tree[now].sum1&&tree[now*2].rr!=0)
            tree[now].sum1=tree[now*2].rr,tree[now].sum2=tree[now*2+1].ll;

    tree[now].len=tree[now*2].len;
    tree[now].ll=tree[now*2].ll;
    tree[now].ren=tree[now*2+1].ren;
    tree[now].rr=tree[now*2+1].rr;

    if(tree[now].ll>=tree[now].sum1&&tree[now].sum2>=tree[now].rr&&tree[now].ll!=0&&tree[now].rr!=0){
        tree[now].sum=tree[now].len=tree[now].ren=tree[now].r-tree[now].l+1;
        tree[now].ll=tree[now].sum2=tree[now].r;
        tree[now].rr=tree[now].sum1=tree[now].l;
    }
    else if(tree[now].ll>=tree[now].sum1&&tree[now].sum1!=0&&tree[now].ll!=0){
        tree[now].sum=tree[now].len=tree[now].sum2-tree[now].l+1;
        tree[now].sum1=tree[now].l;
        tree[now].ll=tree[now].sum2;
    }
    else if(tree[now].sum2>=tree[now].rr&&tree[now].rr!=0&&tree[now].sum2!=0){
        tree[now].sum=tree[now].ren=tree[now].r-tree[now].sum1+1;
        tree[now].sum2=tree[now].r;
        tree[now].rr=tree[now].sum1;
    }
}
void build(int now,int l,int r){
    tree[now].l=l;
    tree[now].r=r;
    if(tree[now].l==tree[now].r){
        tree[now].len=1;
        tree[now].ren=1;
        tree[now].sum=1;
        tree[now].ll=tree[now].r;
        tree[now].rr=tree[now].l;
        tree[now].sum1=tree[now].l;
        tree[now].sum2=tree[now].r;
        return ;
    }
    int mid=(tree[now].l+tree[now].r)/2;
    build(now*2,l,mid);
    build(now*2+1,mid+1,r);
    up(now);
}
void change(int now,int x,int k){
    if(tree[now].l==tree[now].r){
        if(k==1){
            tree[now].ll=0;
            tree[now].rr=0;
            tree[now].sum1=0;
            tree[now].sum2=0;
            tree[now].sum=0;
            tree[now].len=0;
            tree[now].ren=0;
        }
        if(k==0){
            tree[now].sum=1;
            tree[now].len=1;
            tree[now].ren=1;
            tree[now].ll=tree[now].r;
            tree[now].rr=tree[now].l;
            tree[now].sum1=tree[now].l;
            tree[now].sum2=tree[now].r;
        }
        return ;
    }
    int mid=(tree[now].l+tree[now].r)/2;
    if(x<=mid)    change(now*2,x,k);
    else if(x>mid)    change(now*2+1,x,k);
    up(now);
}
int main(){
    freopen("park.in","r",stdin);
    freopen("park.out","w",stdout);
    scanf("%d%d",&n,&m);
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        if(x==1){
            ma[y]=++tot;
            int len=0,pos=0,flag=0;
            if(tree[1].len)    len=tree[1].len-1,pos=1,flag=1;
            if(tree[1].ren-1>len)    len=tree[1].ren-1,pos=tree[1].r,flag=1;
            if((tree[1].sum-1)/2>len)    len=tree[1].sum,pos=(tree[1].sum2+tree[1].sum1)/2;
            else if((tree[1].sum-1)/2==len&&!flag)    len=tree[1].len,pos=(tree[1].sum1+tree[1].sum2)/2;
            change(1,pos,1);
            stop[tot]=pos;
            cout<<pos<<endl;
        }
        else    change(1,stop[ma[y]],0);
    }
}

没调出来的线段树

#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;

const int N=200002;
struct node{
    int x,y,mid,p;
};
node tree[N<<4];
int n,m;
int car[1000001];  //车的位置,如果你6可以加离散化啊 

void update(int bh)
{
    int lc=bh<<1;
    int rc=(bh<<1)+1;
    if (bh)
    {
        tree[bh].x=tree[lc].x;
        tree[bh].y=tree[rc].y;
        tree[bh].mid=tree[lc].mid;
        tree[bh].p=tree[lc].p;
        if (tree[rc].mid>tree[bh].mid)
        {
            tree[bh].mid=tree[rc].mid;  tree[bh].p=tree[rc].p;
        }
        int l=tree[rc].y-tree[lc].x+1;  //两个区间之间的空位
        if (l>tree[bh].mid)
        {
            tree[bh].mid=l;
            tree[bh].p=(tree[lc].y+tree[rc].x)>>1;
        }
    }
    return;
}

void add(int bh,int l,int r,int wz,int z)
{
    if (l==wz&&l==r)
    {
        if (z==1)
        {
            tree[bh].x=l;
            tree[bh].y=r;
            tree[bh].mid=0;   //节点上有车了,当然就没有mid和p值了
            tree[bh].p=0;
            return;
        }
        else
        {
            tree[bh].x=0;
            tree[bh].y=0;
            tree[bh].mid=0;
            tree[bh].p=0;
            return;
        }

    }
    int mid=(l+r)>>1;
    if (wz<=mid) add(bh<<1,l,mid,wz,z);
    if (wz>mid) add((bh<<1)+1,mid+1,r,wz,z);
    update(bh);
}

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    {
        int opt,u;
        scanf("%d%d",&opt,&u);
        if (opt==1)
        {
            if (tree[1].x==0)  //整颗线段树的信息都集中在根节点
            {
                car[u]=1;  //整个停车场都是空的
            }
            else
            {
                int mx=-1;
                if (tree[1].x-1>mx)
                {
                    mx=tree[1].x-1;
                    car[u]=1;  //第一个车位没人停
                }
                if (tree[1].mid>mx)
                {
                    mx=tree[1].mid;
                    car[u]=tree[1].p;
                }
                if (n-tree[1].y>mx)
                {   //最后的车位没人停
                    mx=n-tree[1].y;
                    car[u]=n;
                }
            }
            printf("%d\n",car[u]);
            add(1,1,n,1,1);
        }
        else
        {
            add(1,1,n,car[u],-1);  //出停车场
        }
    }
    return 0;
}

std

时间: 2024-10-07 18:37:38

考前模拟冲刺2的相关文章

2017.11.8 Noip2017 考前模拟赛

----------------------------------T1---------------------------------- ——>足球联赛 题目描述 巴蜀中学新一季的足球联赛开幕了. 足球联赛有 n 只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得 3 分,输一场不得分,平局两只队伍各得一分. 英勇无畏的小鸿是机房的主力前锋, 她总能在关键时刻踢出一些匪夷所思的妙球. 但是很可惜,她过早的燃烧完了她的职业生涯,不过作为一个能够 Burning 的 girl

【NOIP考前模拟赛】纯数学方法推导——旅行者问题

一.写在前面 这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:http://pan.baidu.com/s/1mibdMXi),诸位看官需者自取.另外博主使用此题并没有获得出题人授权,如果出题人看到这篇blog并认为在下侵犯了您的权利,请用站内消息与在下联系,在下会立即删除这篇blog,给您带来的困扰之处敬请谅解. 博主上传这道题主要是因为这题牵扯许多数学运算,推导过程比较复杂,但是却没有用到任何算法或者数学定理,可以说这是一道想法题的典范.

【考前模拟】正确答案

1.正确答案 [题目描述] 小H与小Y刚刚参加完UOIP外卡组的初赛,就迫不及待的跑出考场对答案. "吔,我的答案和你都不一样!",小Y说道,"我们去找神犇们问答案吧". 外卡组试卷中共有m道判断题,小H与小Y一共从其他n个神犇那问了答案.之后又从小G那里得知,这n个神犇中有p个考了满分,q个考了零分,其他神犇不为满分或零分.这可让小Y与小H犯了难.你能帮助他们还原出标准答案吗?如有多解则输出字典序最小的那个.无解输出-1. [输入格式] 第一行四个整数n, m,

【XJOI】【NOI考前模拟赛7】

DP+卡常数+高精度/  计算几何+二分+判区间交/  凸包 首先感谢徐老师的慷慨,让蒟蒻有幸膜拜了学军的神题.祝NOI2015圆满成功 同时膜拜碾压了蒟蒻的众神QAQ 填填填 我的DP比较逗比……(当时看到其他大神有更加优秀的做法) f[i][j]表示前 i 个数,第一行填了 j 个的方案数,那么如果 i 并没有固定位置,f[i][j]=f[i-1][j]+f[i-1][j-1];即 i 这个数放在第一行或是第二行...(废话) 如果 i 固定的位置是第一行(1,y),那么f[i]中只有f[i

Luogu 考前模拟Round. 1

A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小朋友的球 题目:http://www.luogu.org/problem/show?pid=1655 赛中:sb题,第二类斯特林数,加个高精度就行了,我还写了个暴力对拍 赛后:卧槽 怎么只有80 未知错误怎么回事儿啊 C.命运的彼方 题目:http://www.luogu.org/problem/s

9.26模拟赛

NOIP 2017 全真模拟冲刺 ---LRH&&XXY 题目名称 那些年 铁路计划 毁灭 题目类型 传统 传统 传统 可执行文件名 years trainfare destroy 输入文件名 years.in trainfare.in destroy.in 输出文件名 years.out trainfare.out destroy.out 每个测试点时限 1.5s 1.0s 1.0s 内存限制 256 MB 256 MB 256 MB 测试点数目 20 20 20 每个测试点分值 5 5

2017-9-26 NOIP模拟赛

NOIP 2017 全真模拟冲刺 ---LRH&&XXY 题目名称 那些年 铁路计划 毁灭 题目类型 传统 传统 传统 可执行文件名 years trainfare destroy 输入文件名 years.in trainfare.in destroy.in 输出文件名 years.out trainfare.out destroy.out 每个测试点时限 1.5s 1.0s 1.0s 内存限制 256 MB 256 MB 256 MB 测试点数目 20 20 20 每个测试点分值 5 5

考了3年,工作四年,零基础在职终于拿到CFA证书

大家都知道CFA Charterholder是独有的全球公认的投资管理从业人员高职业水平和道德水准的有力证明,是金融界卓越专业成就的象征:CFA资格强调和遵循极其严格的职业操守和道德准则,世界各主要发达国家相关行业都将CFA作为金融行业操守高水平人员的衡量标准,包括中国在内的投资界专业人士,越来越认识到该资格在职业诚信认证的价值. 我是零基础的上班族一名,艰苦的生活条件让我选择了CFA这条更艰苦的路. 如今终于看到了CFA证书向我走来的身影! 闲话少说,进入主题. 2012年我女儿出生当年CFA

frm考试

风险管理涵盖众多领域,包括风险管理概论.数量分析.金融市场与金融产.定价与风险模型.市场风险测度与管理.信用风险测度与管理.操作风险测度与管理.基金投资风险.会计.法律等众多内容.在今日错综复杂.瞬 息万变的金融市场上,风险往往难以掌握.有效管理风险并从中获取利润成为金融企业成功的重要关键.而这一攸关企业组织及其投资人命运的重要决策,需要众多 的金融风险管理专业人士(Financial Risk Professionals)的参与,故FRM日益受到重视,全球报考人数以每年超过38%成长,已俨然成