列表

详情


NC208617. 看星星

描述

现在有n个用来观看星星的天文台,每个天文台有个高度h[i]。现在有m条路连接n个天文台,每一条路连接两个不同的天文台。

一个天文台被称为不好的天文台当且仅当它附近的天文台都比他高,这里定义 "附近的天文台" 为跟它有一条直接相连的路的天文台。

问有多少个不好的天文台?

输入描述

第一行输入n、m

接下来一行n个数,代表每个天文台的高度h[i]

接下来m行 每行两个整数u、v 代表u和v之间有一条路相连

输出描述

一行答案

示例1

输入:

4 3 
1 2 3 4 
1 3 
2 3 
2 4

输出:

2

说明:

【数据范围及约定】

2<=n<=10^5

1<=m<=10^5

1<=h[i]<=10^9

1<=u,v<=n

u!=v

可能存在两个天文台有多条路

单独的一个天文台没有路连接其他的天文台也是不好的天文台

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 579ms, 内存消耗: 152408K, 提交时间: 2020-09-04 09:29:26

import java.util.Scanner;

public class Main
{
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		int n=in.nextInt();
		int m=in.nextInt();
		int[] h=new int[n+1];
		int[] v=new int[n+1];
		for(int i=1;i<=n;i++) 
		{
			h[i]=in.nextInt();
		}
		for(int i=0;i<m;i++) 
		{
			int l=in.nextInt();
			int r=in.nextInt();
			if(h[l]>h[r]) 
			{
				v[l]=1;
			}
			else
			{
				v[r]=1;
			}
		}
		int sum=0;
		for(int i=1;i<=n;i++) 
		{
			if(v[i]==0) sum++;
		}
		System.out.println(sum);
	}
}

C++14(g++5.4) 解法, 执行用时: 59ms, 内存消耗: 1656K, 提交时间: 2020-07-04 15:17:33

#include<bits/stdc++.h>
using namespace std;
class tai
{
	public:
		int w;
		int lt;
		int x;
};
tai sz[100005];
int main()
{
	int a,b;
	scanf("%d %d",&a,&b);
	for(int i=1;i<=a;i++)
	{
		scanf("%d",&sz[i].w);
	}
	for(int i=1;i<=b;i++)
	{
		int x,y;
		scanf("%d %d",&x,&y);
		if(sz[x].w>sz[y].w)
		{
			sz[y].x++;
		}else if(sz[x].w<sz[y].w)
		{
			sz[x].x++;
		}
		sz[y].lt++;
		sz[x].lt++;
	}
	int sum=0;
	for(int i=1;i<=a;i++)
	{
		if(sz[i].lt==sz[i].x || sz[i].lt==0)
		{
			sum++;
		}
	}
	printf("%d\n",sum);
}

C++11(clang++ 3.9) 解法, 执行用时: 190ms, 内存消耗: 8024K, 提交时间: 2020-09-15 19:46:52

#include<bits/stdc++.h>
using namespace std;
vector<int>v[100010];
int n,m;
int h[100010];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>h[i];
	for(int i=1;i<=m;i++)
	{
		int a,b;
		cin>>a>>b;
		v[a].push_back(b),v[b].push_back(a);
	}
	int num=0;
	for(int i=1;i<=n;i++)
	{
		bool flag=1;
		auto it=v[i].begin();
		for(;it!=v[i].end();it++)
		{
			if(h[*it]<=h[i])
				flag=0;
		}
		if(flag)
			num++;
	}
	cout<<num<<endl;
	return 0;
}

上一题