2013.2.A&&3.A

半期考之后,磨磨蹭蹭的刷了两套长乐的模拟题【=-=我现在实在是不敢恭维自己的刷题速度】
感觉貌似很久没有来这里喂食了,就顺便yy下题解好了

2013.2.A:
ice :BFS和spfa都可以,我打了个spfa顺便复习了一【ps:不懂自己在想什么,用cena的时候配置配错了,无限wa啊,=-=之后测了一下标程,不明觉厉】

promotion: DP 感觉自己DP一直都不太会【或许是因为没有很系统的学习】 然后大概想了一下F[I][J]要填什么 大概yy出来之后 貌似调得蛮久的

book :这是之前我在学二分算法的时候打的一题 记得当时模拟写挂了【差点哭瞎】

2013.3.A

country :纯模拟,没有什么好说的【当时自己忘记判在同一个圆的情况,=-=WA的特忧伤】

dec:二分答案+排序【还有这里需要预处理一下把相同的数放在同一集合里】【排序完之后二分找到a+c=b的就可以了】

couple number: 看得第一眼以为是有点厉害的数论 之后发现就是奇数和4的倍数嘛【不到15行=-=整个人都不好了】

3.A的题略水一些

扔上题目和代码=-=
题1 冰岛

【问题描述】

假设你在一个n*n的冰面上,并且你想到达这个冰面的某处,可是由于冰面太滑了,所以当你向某个方向出发后,你没有办法使自己停下来直到你碰到了某个障碍物——因为你可以抓住障碍物使得你的身体停止运动。

因为你已经知道了整个地图,所以你决定在行动之前先计算出最快可到达目标的路线,使得你可以不用走太多冤枉路,这时你决定编程解决这个问题……

【输入格式】

第一行包括一个正整数n(n<=1000)

以下n行,每行包括n个数字(0或1),0表示该点为空地可以滑行,1表示该点为障碍物(障碍物无法穿过)。保证最外圈的地形为障碍物,也就是你无法离开这个地图。

接下来1行包括2个整数x,y(1<=x,y<=n),表示一开始你处于坐标(x,y)

再接下来1行包括2个整数x2,y2(1<=x2,y2<=n),表示你想要到达的目标为(x2,y2)

【输出格式】

只有一个整数t,表示能到达目标的最短时间(假设每经过一次滑行需要花费1单位的时间,无论这次滑行距离的长短)。所谓到达目标要求必须停留在(x2,y2),也就是你不能在到达之后被迫滑向下一个点。当你无法到达目标点时,你只须输出一行字符串’impossible’。

【输入样例1】

1 1 1 1 1

0 0 1 1

0 0 0 1

0 0 0 1

1 1 1 1

2

3

【输出样例1】

说明:由(2,2)到(2,3),再由(2,3)到(4,3),2次滑行到达终点。

【输入样例2】

1 1 1 1

0 1 1

1 0 1

1 1 1

2

3

【输出样例2】

impossible

【数据范围】

20%数据满足 n<=5

40%数据满足 n<=10

60%数据满足 n<=200

    100%数据满足 n<=1000





题2  保送

【题目背景】

yk同学赫赫有名,为什么呢?因为他参加了若干竞赛,所以认识无数大朋友和小盆友。可是无数大朋友和小盆友也都认识他,为什么呢?因为yk同学实在是太牛了~ 我们甚至经常可以在路上听到同学之间的典型谈话:

小A:你认识yk吗?

小B:当然认识啦,就是那个XX竞赛班的大牛哇~

小A:他不光是XX竞赛班的神牛,还是XXX竞赛班的神牛呢~

小B:哦~~ 

然后小A小B一起无限膜拜中……

那么,yk同学到底神到什么地步呢?

世界上总共有N门竞赛,yk同学参加了全部,并且都能拿到保送!!运气好的时候呢,还能拿到一等奖!!怎么样,厉害吧~~ 

【题目描述】

现在有N门竞赛,yk同学对于不同学科有不同的概率拿到一等奖。现在yk想知道,他有多少的概率至少拿到M个一等奖。

【输入格式】promotion.in

第一行两个用空格隔开的正整数N,M

下面N行,每行一个0~1的实数,第i+1行的实数表示第i门科目得到一等奖的概率。

【输出格式】promotion.out

一行一个实数,表示至少得到M门一等奖的概率。实数保留六位小数。

【输入样例1】promotion.in

1

1

【输出样例1】

1.000000

【输入样例2】

1

0.046921

0.959868

0.008229

【输出样例2】

    0.962066

【数据范围】

100% M<=N<=20





题3 任务分配

【问题描述】

图书馆按顺序排列有N本书需要维护,每本书的总页数不相同。现有M位员工。可以给每个员工分配连续的一段书籍,让他进行维护。现在的问题是,怎么样分配,工作任务最重(需要维护的页数最多)的人维护的页数尽量少。 



【输入格式】

第一行两个数,N、M。接下来N行,每行一个整数,表示一本书的页数。



【输出格式】

任务最重的人最少需要维护的页数。



【输入样例】

3

2

1



【输出样例】



【数据范围】

20%数据:N<=1000

30%数据:N<=10000

100%数据::N<=100000,M<=N。一本书的页数最多10000。





题1  圆国旅行

【问题描述】

   圆国是一个国家,它包含几个圆形地区。有些地区可能位于内其他地区,但其边界不相交或触摸。 Qatam是圆国的乡村居民。当他在两个地点之间旅行,他总是试图跨越过尽可能少的边界地区,因为跨越地区边界通常是费力的任务。

【输入】

    输入文件名为country.in。有多组测试数据:

    第一行,包含一个整数Num,表示测试数据的个数。(1<=Num<=10)

    每组测试数据,第一行一个整数N,表示共有N个地区。1<=N<=50. 

    接下来三行,每行N个整数,前两行分别表示每个地区的x坐标和y坐标[-1000,1000],第三行表示该地区圆的半径r[1,1000]。

    最后4个整数,分别表示Qatam的起点和目标点x1,y1,x2,y2[-1000,1000]。

【输出】

   输出文件country.out共Num行,最少穿过的边界数目。

【输出输出样例】

country.in    country.out

 

0

2

-5 1 5 1

0 -6 6

1 2

2 2

-5 1 5 1

1 -3 2 5 -4 12 12

-1 2 5 5 1 1

1 2 1 1 1 2

-5 1 12 1

-3 2 2 0 -4 12 12 12

-1 2 3 1 5 1 1 1 

3 1 7 1 1 2 3

3 13 2

-107 -38 140 148 -198 172 -179 148 176 153 -56 -187

-115 23 -2 -49 -151 -52 42 0 68 109 -174

42 70 39 89 39 43 150 10 120 16 8

16 19 -108    0

3

3



题2  A-B

【问题描述】

    出题是一件痛苦的事情!

    题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈!

    好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数。(不同位置的数字一样的数对算不同的数对)

【输入格式】

    第一行包括2个非负整数N和C,中间用空格隔开。

    第二行有N个整数,中间用空格隔开,作为要求处理的那串数。

【输出格式】

    输出一行,表示该串数中包含的所有满足A-B=C的数对的个数。

【输入输出样例】

dec.in    dec.out

1

1 2 3    3

【数据规模】

    对于90%的数据,N <= 2000;

    对于100%的数据,N <= 200000。

    所有输入数据都在longint范围内。



题3   Couple Number

【问题描述】

    任何一个整数N都能表示成另外两个整数a和b的平方差吗?如果能,那么这个数N就叫做Couple number。你的工作就是判断一个数N是不是Couple number。

【输入格式】

    仅一行,两个长整型范围内的整数n1和n2,之间用1个空格隔开。

【输出格式】

    输出在n1到n2范围内有多少个Couple number。

    注意:包括n1和n2两个数,且n1<n2,n2 - n1 <= 10 000 000。

【输入样例】

10

【输出样例】

7

 
  

  ice:

#include<cstdio>

#include<cstring>

using namespace std;

int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};

long long vis[1010][1010],d[2000001][3],n,h=1,w=1;

bool s[1010][1010];

void SPFA(int x,int y,int xx,int yy){

    int t,l;

    d[1][0]=x;d[1][1]=y;

    vis[x][y]=0;

    while(h<=w){

      for(int i=0;i<4;i++){

          t=d[h][0]+dx[i];

          l=d[h][1]+dy[i];

          if(s[t][l]) continue;

          while(!s[t+dx[i]][l+dy[i]]){

             t+=dx[i];

             l+=dy[i];

          }

          if(x==t && y==l) continue;

          if(vis[t][l]!=0) continue;

          vis[t][l]=vis[d[h][0]][d[h][1]]+1;

          w++;

          d[w][0]=t;d[w][1]=l;

          if(t==xx && l==yy) return;

      }

      h++;

    }

}

int main()

{    

    int x,y,xx,yy;

    freopen("ice.in","r",stdin);freopen("ice.out","w",stdout);



    memset(d,0,sizeof(d));

    memset(vis,0,sizeof(vis));

    scanf("%d",&n);

    for (int i=1;i<=n;i++)

        for (int j=1;j<=n;j++){ 

              scanf("%d",&x);

              s[i][j]=x;

           }

    scanf("%d%d",&x,&y);

    scanf("%d%d",&xx,&yy);

    SPFA(x,y,xx,yy);

    if(vis[xx][yy]!=0) printf("%d\n",vis[xx][yy]);

      else {

           if(x==xx && y==yy) printf("0\n");

              else printf("impossible\n");

           }

    return 0;

}

  

    promotion:

#include<cstdio>

#include<cstring>

#include<iostream>

using namespace std;

double f[30][30],a[30],ans=0;

int n,m;

int main(){

    freopen("promotion.in","r",stdin);freopen("promotion.out","w",stdout);

    scanf("%d%d",&n,&m);

    memset(a,0,sizeof(a));

    for(int i=1;i<=n;i++){

        cin>>a[i];

    }

    f[0][0]=1;

    for (int i=1;i<=n;i++)

    {

      f[i][0]=f[i-1][0]*(1-a[i]);

      for (int j=1;j<=i;j++)

        f[i][j]=f[i-1][j]*(1-a[i])+f[i-1][j-1]*a[i];

    }

    for (int i=m;i<=n;i++) ans+=f[n][i];

    printf("%.6lf",ans);



    return 0;

}



  book:

#include<cstdio>

#include<cstring>

using namespace std;

int a[100001],n,m;

bool check(int x){

int now=x,num=0;

    for (int i=0;i<n;i++){

      if (x<a[i]) return false;

      if (now-a[i]<0){

        now=x;

        num++;

        now-=a[i];

        if (num==m) return false;

      }

      else

        now-=a[i];

    }

    return true;

}

int main(){

    int i,j,s,t,tot=0;

    //freopen("book.in","r",stdin);freopen("book.out","w",stdout);

    

    scanf("%d%d",&n,&m);

    for (i=0;i<n;i++){

        scanf("%d",&a[i]);

        tot+=a[i];

    }

    int r=tot,l=0;

    while (l<=r){

        int mid=(l+r)>>1;

        if(check(mid)) r=mid-1;

                  else l=mid+1;

    }

    printf("%d",l);

    return 0;

}

  country:

#include<cstdio>

#include<cstring>

using namespace std;

int n,m,x[501],y[501],r[501],print[501],fx,fy,ex,ey,min,t;

void check(int x,int y,int r,int a,int b){

    if((x-a)*(x-a)+(y-b)*(y-b)<r*r){

        min++;++t;

    }

}

int main(){

    freopen("country.in","r",stdin);freopen("country.out","w",stdout);

    scanf("%d",&n);

    for(int i=0;i<n;i++){

        min=0;

        memset(x,0,sizeof(x));

        memset(y,0,sizeof(y));

        memset(r,0,sizeof(r));

        scanf("%d",&m);

           for(int j=0;j<m;j++)  scanf("%d",&x[j]);

           for(int j=0;j<m;j++)  scanf("%d",&y[j]);

           for(int j=0;j<m;j++)  scanf("%d",&r[j]);

        scanf("%d%d%d%d",&fx,&fy,&ex,&ey);

        for(int k=0;k<m;k++){

            t=0;

            check(x[k],y[k],r[k],fx,fy);

            check(x[k],y[k],r[k],ex,ey);

            if(t==2) min-=2;

        }

        print[i]=min;

    }

    for(int i=0;i<n;i++) printf("%d\n",print[i]);

    return 0;

}

  dec:

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

const int MAXN=2000001;

long long  a[MAXN],num[MAXN],n,ans=0,c,l,r,mid;

int main(){

    freopen("dec.in","r",stdin);

    freopen("dec.out","w",stdout);

    scanf("%d%d",&n,&c);

    memset(num,0,sizeof(num));

    for(int i=0;i<n;i++){

        scanf("%d",&a[i]);

        num[a[i]]++;

    }

    sort(a,a+n);

    for(int i=1;i<n;i++){

        l=1;r=i-1;

        while(l<=r){

            mid=(l+r)>>1;

            if(a[i]-a[mid]>c) l=mid+1;

              else{

                if(a[i]-a[mid]<c) r=mid-1;

                  else{

                         ans=ans+num[a[mid]]; 

             break;

    }}}}

    

    printf("%d",ans);

    return 0;

}

  couple

#include<cstdio>

#include<cstring>

#include<cmath>

using namespace std;

long long n,m,ans=0;

int main(){

    freopen("couple.in","r",stdin);

    freopen("couple.out","w",stdout);

    scanf("%d%d",&n,&m);

    for(int i=n;i<=m;i++){

        if(i%4==0 || i%2!=0) ans++;

    }

    printf("%d",ans);

    return 0;

}

  

 

 

你可能感兴趣的:(&&)