NOIP普及组复赛题集

问题 A: 抓牛

题目描述

牛倌被通知,他的一只牛逃逸了!所以他决定,马上出发,尽快把那只牛抓回来.

他们都站在数轴上.牛倌在N(0≤N≤100000)处,牛在K(0≤K≤100000)处.约翰有两种办法移动,步行和瞬移:步行每秒种可以让约翰从x处走到x+l或x-l处;而瞬移则可让他在1秒内从x处消失,在2x处出现.然而那只逃逸的牛,悲剧地没有发现自己的处境多么糟糕,正站在那儿一动不动.

   那么,牛倌需要多少时间抓住那只牛呢?

输入

仅有两个整数N和K

输出

最短时间

样例输入

5 17

样例输出

4


问题 B: 修路

题目描述

城市管理部门打算好好修一下农场中某条凹凸不平的土路。按市民们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中。 整条路被分成了N段,N个整数A_1, … , A_N (1 <= N <= 2,000)依次描述了每一段路的高度(0 <= A_i <= 1,000,000,000)。城市管理部门希望找到一个恰好含N个元素的不上升或不下降序列B_1, … , B_N,作为修过的路中每个路段的高度。由于将每一段路垫高或挖低一个单位的花费相同,修路的总支出可以表示为: |A_1 - B_1| + |A_2 - B_2| + … + |A_N - B_N| 请你计算一下,FJ在这项工程上的最小支出是多少。城市管理部门向你保证,这个支出不会超过2^31-1。

输入

第1行: 输入1个整数:N * 第2..N+1行: 第i+1行为1个整数:A_i

输出

第1行: 输出1个正整数,表示FJ把路修成高度不上升或高度不下降的最小花费

样例输入

7

1

3


2


4


5


3


9

样例输出

3

#include
#include
#include
#include
#include
#define inf 0x7fffffff
using namespace std;
inline int read()
{
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x;
}
int n,a[2005],b[2005];
int c[2005][2005],f[2005][2005];
int ans=inf;
inline bool cmp(int a,int b){return a>b;}
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
        a[i]=b[i]=read();
    sort(b+1,b+n+1);
    for(int i=1;i<=n;i++)
        f[i][0]=inf;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            c[i][j]=f[i-1][j]+abs(b[j]-a[i]);
            f[i][j]=min(f[i][j-1],c[i][j]);
        }
    ans=f[n][n];
    sort(b+1,b+n+1,cmp);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            c[i][j]=f[i-1][j]+abs(b[j]-a[i]);
            f[i][j]=min(f[i][j-1],c[i][j]);
        }
    ans=min(ans,f[n][n]);
    printf("%d",ans);
    return 0;
}

问题 C: 魔法照片

题目描述

如果你看过《哈利·波特》,你就会知道魔法世界里的照片是很神奇的。也许是因为小魔法师佳佳长的太帅,很多人都找他要那种神奇的魔法照片,而且还都要佳佳和他的MM的合照。那些照片可是非常珍贵的,他到底应该把照片给谁呢?

一共有n个人(以1–n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人。佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i]。然后将初始权值从大到小进行排序,每人就有了一个序号D[i](取值同样是1–n)。按照这个序号对10取模的值将这些人分为10类。也就是说定义每个人的类别序号C[i]的值为(D[i]-1) mod 10 +1,显然类别序号的取值为1–10。第i类的人将会额外得到E[i]的权值。你需要做的就是求出加上额外权值以后,最终的权值最大的k个人,并输出他们的编号。在排序中,如果两人的W[i]相同,编号小的优先。

输入

第一行输出用空格隔开的两个整数,分别是n和k。

第二行给出了10个正整数,分别是E[1]到E[10]。

第三行给出了n个正整数,第i个数表示编号为i的人的权值W[i]。

输出

只需输出一行用空格隔开的k个整数,分别表示最终的W[i]从高到低的人的编号。

样例输入

10 10

1 2 3 4 5 6 7 8 9 10

2 4 6 8 10 12 14 16 18 20

样例输出

10 9 8 7 6 5 4 3 2 1


问题 D: 取暖管道

题目描述

一块矩形土地被分为N*M的单位正方形,现在要在这块土地埋设取暖管道,管道将从坐标为(1,1)小块(左上角,上部边缘)延伸到(N,M)(右下角,右部边缘)

每种管道将占据一个单位正方形土地.而且管道不能旋转.显而易见,要构成一个管道系统,我们必须保证管道是连续贯通的.

一开始,在地图上标出了已经埋设好的管道.在铺设管道系统时可以利用这些管道,但不能把它们移开铺设新管道;同时,标有树木的方格表示这里是花园,地下不能埋设管道.

下面请你写一个程序,对一个给定的地图,找出有多少种不同的铺设方案.

输入

第一行为两个整数N和M(都不超过10),接下来的M行,每行有N个整数,表示地图中的每一小格.其中1-4依次表示图中四种管道,5表示花园,0表示空地.

输出

单个整数,表示不同方法数.

样例输入

4 5

0 0 3 2

0 4 0 5

4 0 0 0

4 0 1 0

0 3 0 0

样例输出

3

你可能感兴趣的:(NOIP)