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
",vis[xx][yy]);
      else {
           if(x==xx && y==yy) printf("0
");
              else printf("impossible
");
           }
    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
",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;
}

  

 
原文地址:https://www.cnblogs.com/polebug/p/3708315.html