ZOJ 3708 전원 네트워크 의 밀도(물 문제)

제목 링크:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3708
제목:
    제목 은 매우 간단 하 다.바로 몇 가지 노선 이 있 는 지,그리고 버스 의 수량 을 세 어 보 는 것 이다.제목 의 그림 은 매우 무섭다.만약 에 이 위협 을 받 으 면 비참 하 다.성 경 기 를 할 때 모든 문 제 를 자세히 보아 서 불필요 한 손실 을 초래 하지 않도록 해 야 한다.
해법 1:
     팀 원 들 이 사용 하 는 방법 은 2 차원 그림 으로 대응 위치 가 이미 표시 되 었 다 면 계 수 를 넣 지 않 고 표시 되 지 않 았 다 면 표시 하고 계산 치 를 하나 더 하 는 것 이다.
코드:
#include<iostream>
#include<string>
#include<iomanip>
#include<cstring>
using namespace std;
int a[505],b[505];
int  map[505][505];
int main()
{
	int T,bus,m;
	cin>>T;
	while(T--)
	{
		cin>>bus>>m;
		memset(map,0,sizeof(map));
		int sum=0;
		for(int i=1;i<=m;i++)
		{
			cin>>a[i];
		}
		for(int i=1;i<=m;i++)
		{
			cin>>b[i];
		}
		for(int i=1;i<=m;i++)
		{
			if(map[a[i]][b[i]]||map[b[i]][a[i]])
			continue;
			else
			{
				map[a[i]][b[i]]=1;
			 sum++;
		   }
		}
		double ans;
		ans=sum*1.0/(bus*1.0);
		cout<<fixed<<setprecision(3)<<ans<<endl;
	}
	
}

해법 2:
    제 생각 은 작은 것 을 곱 해서 1000(원시 데 이 터 는 최대 500 밖 에 안 되 기 때문에 구분 할 수 있 습 니 다)을 얻 을 수 있 고 큰 것 을 더 해서 set 로 무 게 를 줄 이면 됩 니 다.
코드:
#include <iostream>
#include <string>
#include <iomanip>
#include <set>
#include <algorithm>
using namespace std;
int a[505],b[505]; 
int main()
{
	int T,bus,m,minn,maxx;
	cin>>T;
	while(T--)
	{
		set <int> cnt;
		cin>>bus>>m;
		for(int i=1;i<=m;i++)
		{
			cin>>a[i];
		}
		for(int i=1;i<=m;i++)
		{
			cin>>b[i];
		}
		for(int i=1;i<=m;i++)
		{
			minn=min(a[i],b[i]);
			maxx=max(a[i],b[i]);
			cnt.insert(minn*1000+maxx);
		}
		double ans;
		ans=cnt.size()*1.0/bus;
		cout<<fixed<<setprecision(3)<<ans<<endl;
	}
	return 0;
}

좋은 웹페이지 즐겨찾기