您的位置:首页 > 其它

【京东校招笔试】保卫方案

2016-09-18 11:44 148 查看
时间限制:c/c++语言1000MS;其他语言3000MS

内存限制:c/c++语言65536KB;其他语言589824KB

题目描述:

战争游戏的至关重要环节就要到来了,这次的结果将决定王国的生死存亡,小B负责首度的防卫工作。首都处于一个四面环山的盆地,周围的n个小山构成一个环,作为预警措施,小B计划在每个小山上设置一个观察哨,日夜不停的瞭望周围发生的情况。

一旦发生外敌入侵事件,山顶上的岗哨将点燃烽烟。若两个岗哨所在的山峰之间没有更高的山峰遮挡两者之间有相连通路,则岗哨可以观察到另一个山峰上的烽烟是否点燃。由于小山处于环上,任意两个小山之间存在两个不同的连接通路,满足上述不遮挡的条件下,一座山峰上岗哨点燃的烽烟至少可以通过一条通路被另一端观察到。对于任意相邻的岗哨,一端的岗哨一定可以发现一端点燃的烽烟。

小B设计的这种保卫方案的一个重要特性是能够观测到对方烽烟的岗哨对的数量,她希望你能够帮助她解决这个问题。

输入:

输入中有多组测试数据。每组测试数据的第一行为一个整数n(3<=n<=10^6),为首都周围的小山数量,第二行为n个整数,依次表示小山的高度h,(1<=h<=10^9)。

输出:

对每组测试数据,在单独的一行中输出能相互观察到的岗哨的对数

样例输入:

5
1 2 4 5 3
样例输出

7
思路:取两座山峰作为两端,当两端的最小值大于中间山峰中的最大值时,这两座山峰是可以互相瞭望到的。

c++代码

#include<iostream>
#include<vector>
using namespace std;

int n; //小山的数量
int location(int num){ //防止位置出界
if(num>=0 && num<n)
return num;
else if(num<0){
return n+num;
}else{
return num-n;
}
}

int main(){
while(cin>>n){
vector<int> h; //存小山的高度
for(int i=0; i<n; i++){
int tmp;
cin>>tmp;
h.push_back(tmp);
} //for

int count=0;
for(int i=0; i<n; i++){
for(int j=location(i+1); location(j)!=location(i-1); j++){
j=location(j);
int max=0;
for(int k=location(i+1);location(k)!=j; k++){
k=location(k);
if(h[k]>max)
max=h[k];
}
int min=h[i]<h[j]?h[i]:h[j];
if(min>max)
count++;
}
}
cout<<count<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: