算法课复习 -- 贪心

HDU #1863 : 畅通工程

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1863

题意:有n个点和m条权值边,问将整个图连通最少需要花费多少。

思路:最小生成树。

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define P pair
#define ll long long
#define ull unsigned long long
#define lson id*2,l,mid
#define rson id*2+1,mid+1,r
#define ls id*2
#define rs (id*2+1)
#define Mod(a,b) a edge[maxn];

struct cmp
{
	bool operator()(node a, node b)
	{
		return a.cost > b.cost;
	}
};

void init()
{
	cnt = 0;
	cl0(used);
	for (int i = 1; i <= n; i++)
		edge[i].clear();
}

int main()
{
	while (~scanf("%d%d", &m, &n)) {
		if (m == 0)break;
		init();
		int aa, bb, cc; cc = INF;
		for (int i = 1; i <= m; i++) {
			scanf("%d%d%d", &x, &y, &z);
			edge[x].push_back(node{ y,z });
			edge[y].push_back(node{ x,z });
			if (z < cc) {
				cc = z; aa = x; bb = y;
			}
		}
		used[aa] = true; used[bb] = true;
		priority_queue, cmp> que;
		for (int i = 0; i < edge[aa].size(); i++) 
			que.push(edge[aa][i]);
		for (int i = 0; i < edge[bb].size(); i++)
			que.push(edge[bb][i]);
		int now = 2, ans = cc;
		while (now < n && !que.empty()) {
			node u = que.top(); que.pop();
			if (!used[u.to]) {
				now++;
				used[u.to] = true;
				ans += u.cost;
				for (int i = 0; i < edge[u.to].size(); i++)
					que.push(edge[u.to][i]);
			}
		}
		if (now != n)
			puts("?");
		else
			printf("%d\n", ans);
	}	
	return 0;
}

 

HDU #1053 : Entropy

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1053

题意:给一个字符串,问最少需要多少位就可以将它编码。

思路:Huffman编码。优先队列,每次把最小的两块拿出来相加再塞回队列,队列里最后一个元素就是答案。

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define P pair
#define ll long long
#define ull unsigned long long
#define lson id*2,l,mid
#define rson id*2+1,mid+1,r
#define ls id*2
#define rs (id*2+1)
#define Mod(a,b) a mp;

void init()
{
	mp.clear();
	cl0(cnt);
	now = 0;
}

struct cmp
{
	bool operator()(int a, int b)
	{
		return a > b;
	}
};

int main()
{
	while (cin >> str) {
		if (str == "END")break;
		init();
		int len = str.length();
		for (int i = 0; i < len; i++) {
			if (mp[str[i]] == 0)
				mp[str[i]] = ++now;
			cnt[mp[str[i]]]++;
		}
		priority_queue, cmp> que;
		int ans = 0;
		for (int i = 1; i <= now; i++)
			que.push(cnt[i]);
		if (que.size() == 1)
			ans = cnt[1];
		else {
			while (que.size() > 1) {
				int a = que.top(); que.pop();
				int b = que.top(); que.pop();
				que.push(a + b);
				ans += a + b;
			}
		}
		printf("%d %d %.1f\n", len * 8, ans, (double)len * 8 / ans);
	}
	return 0;
}

 

HDU #2021 : 发工资咯:)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2021

题意:将正整数n表示为若干个100、50、10、5、2和1的和,问最少需要多少个。

思路:因为对于每两个值a、b(a>b)都有a>=2b,所以直接贪心即可。

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define P pair
#define ll long long
#define ull unsigned long long
#define lson id*2,l,mid
#define rson id*2+1,mid+1,r
#define ls id*2
#define rs (id*2+1)
#define Mod(a,b) a

 

HDU #4221 : Greedy?

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4221

题意:有n件事,每件事有完成所需时间c,并且应该在时间d前完成。问所有事最少超时之和为多久。

思路:按d从小到大排列按顺序完成,累加时间就是答案。

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define P pair
#define ll long long
#define ull unsigned long long
#define lson id*2,l,mid
#define rson id*2+1,mid+1,r
#define ls id*2
#define rs (id*2+1)
#define Mod(a,b) a

 

HYSBZ #1826 : 缓存交换

传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1826

题意:cache调度,按顺序给出n个内存块。问怎么调度miss最少。

思路:当cache满时,如果miss发生就将cache中在之后最晚再出现的块踢掉。

优先队列,记录内存块编号及它下一次出现的时间,如果再也不出现时间就为INF,按照下次时间从大到小排。

由于n<=1e5,但内存块编号<=1e9,可以用map来搞。

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define P pair
#define ll long long
#define ull unsigned long long
#define lson id*2,l,mid
#define rson id*2+1,mid+1,r
#define ls id*2
#define rs (id*2+1)
#define Mod(a,b) a mp;
bool used[maxn];

struct node
{
	int id;
	int nxt;
};

struct cmp
{
	bool operator()(node a, node b)
	{
		return a.nxt < b.nxt;
	}
};

int main()
{
	while (~scanf("%d%d", &n, &m)) {
		mp.clear(); cnt = 0; cl0(used);
		queue nxt[maxn];
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a[i]);
			if (mp[a[i]] == 0)
				mp[a[i]] = ++cnt;
			nxt[mp[a[i]]].push(i);
		}
		for (int i = 1; i <= cnt; i++)
			nxt[i].push(INF);
		priority_queue, cmp> que;
		int now = 0, ans = 0;
		for (int i = 1; i <= n; i++) {
			if (!used[mp[a[i]]]) {
				ans++; used[mp[a[i]]] = true;
				if (now != m) 
					now++;
				else {
					node u = que.top(); que.pop();
					used[u.id] = false;
				}
			}
			nxt[mp[a[i]]].pop();
			que.push(node{ mp[a[i]],nxt[mp[a[i]]].front() });
		}
		printf("%d\n", ans);
	}
	return 0;
}

 

你可能感兴趣的:(算法课复习)