回 帖 发 新 帖 刷新版面

主题:第74次编程比赛题目



1.找单数(30%)
    给定一个含有n个数的序列,这个序列中恰好有两个数出现一次,请你找出这两数。(假定其他的数都有两个)
    函数原型如下:
// array[]  -- n个数的序列,数的取值范围(-1e9,1e9)
// n        -- 数的个数,2<=n<=10^8
// reslut[]-- 返回数组,长度为2
void findSingle(int array[], int n,int reslut[])
{
   
}

2.炮兵阵地(70%)
Description
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也
可能是平原(用"P"表示)。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地
图上的攻击范围沿横向左右各两格,沿纵向上下各两格。其它位置均攻击不到。另外炮兵的攻击范围不受地形的影响。 
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他
支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。 

Input
第一行包含两个由空格分割开的正整数,分别表示N和M; 
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。

Output
仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。

Source
POJ1185 http://acm.pku.edu.cn/JudgeOnline/problem?id=1185

比赛截止时间
2008年10月18号18:00

提问请到http://bbs.pfan.cn/post-286940.html

回复列表 (共22个回复)

21 楼

囧,第一题
[code=c]
void findSingle(int array[],int len,int result[]){
    int idx,mask =0,a =0,b =0;
    for(idx =0;idx <len;idx ++) mask ^= array[idx];
    for(idx =0;mask&(1<<idx)==0;idx ++);
    mask &= 1<<idx;
    for(idx =0;idx <len;idx ++)
        if(mask&array[idx]) a ^= array[idx];
        else                b ^= array[idx];
    result[0] = a;
    result[1] = b;
}
[/code]

22 楼

第一题 hash
第二题
      先考虑全是平原的(n+x)*(m+x)地图:炮兵最优部署是有规律的
     从中选出山地上部署最少的即可

我来回复

您尚未登录,请登录后再回复。点此登录或注册