特长生模拟——09年东莞特长生考试

今天的这个考试,
估分:100+100+100+100=400
实际:100+10+100+100=310
一脸懵逼,第二题大家基本都对了…
我因为一点小失误而..

T1:惊人的记忆力

希望中学的小明非常聪明,记忆力非常的好,可以达到过目不忘的程度,你任意给他一列数,他可以很快的按从小到大的顺序说出来。现在小A为了考考小明,任意给小明两列数,分别有N,M个数,要求他将这两个数列中的数合并成一个数列,按从小到大的顺序说出这些数,相同的数只保留一个。现在也请你编程序来解决这个问题。
 
1=< N,M <= 10000, 两个数列中的数x都是整数,且符合条件: -1000 = < x <= 1000

分析:这题随便开个桶搞搞

#include
#include
#define N 1000

int n,x,num[2005];

int main()
{
    scanf("%d",&n);
    for (int i=1; i<=n; i++)
         {
             scanf("%d",&x);
             num[x+N]++;     
         }
    scanf("%d",&n);
    for (int i=1; i<=n; i++)
         {
             scanf("%d",&x);
             num[x+N]++;     
         }
    for (int i=-1000; i<=1000; i++)
         if (num[i+N]) printf("%d ",i); 
    return 0;
}

T2:岛屿的缘分

人和人的相识是一种缘分,其实人有幸到某地也是一种缘分。某风景优美的K小岛的缘分和其他景点的缘分来得不一般,K岛上有一个石碑刻上了两个很大很大的整数x和y,和一个正整数K,后面写道:“谁能准确的写出x和y的乘积中最右边的k位数(如果乘积不足K位则在左边用“0”补足K位),他就是和K小岛有缘分的人”,李先生到了K小岛,他马上叫他的秘书算一算,写出x和y的乘积中最右边的k位数,看看李先生和他的秘书是否和K小岛有缘分。现在也请你完成这个工作(注意: 如果乘积不足K位则在左边用“0”补足K位)。

正整数x和y位数不大于120
1=< K <=250

分析:
这题不是一道傻逼高精度吗…
我怎么会错啊,手误+脑残….
考场这样失误就真凉了

#include
#include
#include

using namespace std;

char x[505],y[505];
int a[505],b[505],c[505],la,lb,rp,lc,k;
int main()
{
    scanf("%s%s%d",x,y,&k);
    la=strlen(x);
    lb=strlen(y);
    for (int i=0; i'0'; 
    for (int i=0; i'0'; //这里lb写成了la
    for (int i=1; i<=la; i++)
         {
             rp=0;
             for (int j=1; j<=lb; j++)
                  {
                      c[i+j-1]=c[i+j-1]+a[i]*b[j]+rp;//这里一开始没有将自身加进去
                      rp=c[i+j-1]/10;
                      c[i+j-1]%=10;
                  }
             c[i+lb]=rp;
         }
    lc=la+lb;
    while (c[lc]==0 && lc>1) lc--;
    for (int i=k; i>=1; i--) printf("%d",c[i]);
    return 0; 
}



T3:导游的魔棒

小C“五一”节参加了五星旅行社组织的一次外出旅游,这次旅游中,小C遇到一件非常有趣的事: 五星旅行社的导游小张有一根魔棒,这根魔棒在每一次的旅游中可以产生一次魔力(也只能产生一次魔力),这魔力可以使两个景点间的距离减成原来的一半。小C在“五一”节的这次旅游中,很有幸是小张导游作为他们的导游,小张当然也没有忘记带他的魔棒,因为他可以发挥魔棒的作用,使路程减少呢。这次旅游中,去了一个有N个景点的旅游区,这个旅游区只有一个入口,在景点编号为1的地方,一个出口,在景点编号为N的地方,景点编号为1,2,3,…,N。在入口处有一个N×N的数据阵,描述了景点间的距离,a[I,j]表示景点i到景点j的距离。因为小C的公司有急事要小C尽快回来,现在小C要用张导游的魔棒,使得从入口到出口的距离最短。现在我们也来编一个程序:求将哪一条边减半后使从顶点1到顶点N的最短路径长度最短,输出这个最短距离,如果找不到从1到N的路径,则输出 -1 。
3 ≤ N ≤ 50

分析:
这题很显然dp或者记搜
dp[i][j][0/1]表示i走到j 没用/用了 将边减半的最短距离
然后floyd瞎搞

#include
#include
#include
#define N 23333333

using namespace std;

int n;
double x,f[55][55][2]; 

int main()
{
    scanf("%d",&n);
    for (int i=1; i<=n; i++) 
         for (int j=1; j<=n; j++) 
              {
                  scanf("%lf",&x);
                  if (x==0) {
                               f[i][j][0]=N;
                               f[i][j][1]=N;
                            }
                       else {
                               f[i][j][0]=x;
                               f[i][j][1]=x/2;
                            }
              }
    for (int k=1; k<=n; k++)
         for (int i=1; i<=n; i++)
              for (int j=1; j<=n; j++)
                   if (k!=i && k!=j && i!=j)
                       {
                            f[i][j][0]=min(f[i][j][0],f[i][k][0]+f[k][j][0]);
                            f[i][j][1]=min(f[i][j][1],f[i][k][1]+f[k][j][0]);
                            f[i][j][1]=min(f[i][j][1],f[i][k][0]+f[k][j][1]);
                       }
    if (f[1][n][1]!=N) printf("%.2lf",f[1][n][1]);
                  else printf("-1");
    return 0;
}

T4:开发区规划

小王是D市主管经济的副市长,由于经济发展的需要,要在D市组建一个高新技术开发区,经过研究,规划局在D市的东部划出了一块土地作为开发区选址。这块土地是一块矩形平原,小王准备在上面修建一些建筑。为了规划方便,他将矩形划分成N*M格。棘手的是,这块土地有些历史文化遗址散布在某些格子内,这些历史文化遗址是万万不能拆除的,否则将激起民愤,小王深知这一点,因此,他的新建筑在选址时要避开这些格子。
  假设新的建筑物有P种规格,每种建筑物都是正方形的,占地为Ti*Ti格 (1<=i<=P)。小王想知道对于每种规格的建筑,有多少种不同的合适选址方案(一种合适的选址方案指的是在该建筑所占的正方形区域内不存在有历史文化遗址的格子)。现在请你来当小王的秘书 帮他完成这个光荣而艰巨的任务。

1<=N,M<=2000,1<=P<=1000
1 < Ti<=max(M,N)

分析:
显然直接的枚举会TLE,所以我们要带技巧的枚举,
详见代码,手动画一下就很容易知道是什么意思,
这样的枚举时间复杂度为O(NM),并且我们可以将所有的位置作为右下角最大能拓展的正方形的边长k求出,并且累加。
对于任意一点cp所能拓展到的最大的边长k而言,存在一个边长为k的正方形rp且右下角的点为cp
rp包含的所有点的任意一点j,
j的位置作为右下角的正方形都已经将自身的最长拓展边长op累加过了,
而自身只是累加了拓展边长为k的正方形,但自身去拓展边长为op的正方形也没有问题,所以要加进去

然后就可以O(1)查询了。
时间复杂度:O(NM+P)

#include 
#include 
#include 
#define N 2005

using namespace std;

int a[N],x[N],y[N],cmax[N],sum[N],rp,n,m,p,q;
char xy[N];

int main()
{
    scanf("%d%d%d",&n,&m,&q);
    scanf("%s",xy);
    for (int k=0; kif (xy[k]-'0') {x[k+1]=x[k]+1; y[k+1]++; cmax[k+1]=1; sum[1]++; }
                   else {x[k+1]=0; y[k+1]=0; }
    for (int i=2; i<=n; i++) 
        {
             scanf("%s",xy);
             for (int k=0; kif (xy[k]-'0') {x[k+1]=x[k]+1; y[k+1]++; }
                            else {x[k+1]=0; y[k+1]=0; }
             for (int k=m; k>=1; k--)
                  if (xy[k-1]-'0')
                  {
                      cmax[k]=cmax[k-1]+1;
                      cmax[k]=min(cmax[k],x[k]);
                      cmax[k]=min(cmax[k],y[k]);
                      sum[cmax[k]]++;
                  } else cmax[k]=0;
        }
    for (int i=min(n,m); i>=1; i--) sum[i]+=sum[i+1];
    for (int i=1; i<=q; i++)
         {
             scanf("%d",&p);
             printf("%d\n",sum[p]);
         }
    return 0;
}

你可能感兴趣的:(C++,高精度,排序&拓扑,暴力/枚举/模拟,动态规划)