HDU-5813-Elegant Construction【多校2016】【贪心】
5813-Elegant ConstructionProblem Description For business purpose,the connectivity between towns has some requirements. You are given N non-negative integers a1 .. aN. For 1 <= i <= N,passenger start from town i,should be able to reach exactly ai towns (directly or indirectly,not include i itself). To prevent confusion on the trip,every road should be different,and cycles (one can travel through several roads and back to the starting point) should not exist. Your task is constructing such a city. Now it’s your showtime! Input Output If Y is “Yes”,output an integer M in a line,indicating the number of roads. Then M lines follow,each line contains two integers u and v (1 <= u,v <= N),separated with one single space,indicating a road direct from town u to town v. If there are multiple possible solutions,print any of them. Sample Input Sample Output 题目链接:HDU⑸813 题目大意:给出n个点(1~n),和每一个点能到达的点的个数(直接或间接)。问是不是存在这类可能性 题目思路:贪心,先给点的出度排序。
以下是代码: #include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <functional>
#include <numeric>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#include <deque>
#include <list>
using namespace std;
struct node
{
int a,pos;
}p[2005];
bool cmp(node a,node b)
{
return a.a < b.a;
}
vector <pair<int,int> > ans;
int n;
int solve()
{
for (int i = 1; i <= n; i++)
{
int num = p[i].a;
for (int j = 1; j < i; j++)
{
if (p[i].a == p[j].a) break;
num--;
}
if (num > 0) return 0;
}
return 1;
}
int main()
{
int t;
cin >> t;
int cas = 1;
while(t--)
{
cin >> n;
ans.clear();
for (int i = 1; i <= n; i++)
{
cin >> p[i].a;
p[i].pos = i;
}
sort(p + 1,p + n + 1,cmp);
int flag = solve();
if (!flag)
{
printf("Case #%d: Non",cas++);
continue;
}
for (int i = 1; i <= n; i++)
{
int num = p[i].a;
for (int j = 1; j < i; j++)
{
if (p[i].a == p[j].a) break;
if (num <= 0) break;
num--;
ans.push_back(make_pair(p[i].pos,p[j].pos));
}
}
int len = ans.size();
printf("Case #%d: Yesn",cas++);
printf("%dn",len); //如果len等于0,这个0输出不输出都可以
for (int i = 0; i < len; i++)
{
printf("%d %dn",ans[i].first,ans[i].second);
}
}
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |