洛谷100题DAY3

11.P1094 [NOIP2007 普及组] 纪念品分组

#include
using namespace std;
const int N = 3e5 + 10;
int w, n, ans, a[N];
int main()
{
	cin >> w >> n;
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
	}
	sort(a + 1, a + 1 + n);
	for(int i = 1, j = n; i <= j;)
	{
		if(a[i] + a[j] <= w)
		{
			ans ++;
			i ++;
			j --;	
		}
		else
		{
			ans ++;
			j --;
		}	
	} 
	cout << ans;
	return 0;
}

12.P1102 A-B 数对

B不需要一一列举,直接A - C即可

#include
using namespace std;
const int N = 3e5 + 10;
map mp;
long long n, c, ans, a[N];
int main()
{
	cin >> n >> c;
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
		mp[a[i]] ++;
	}
	for(int i = 1; i <= n; i ++)
	{
		ans += mp[a[i] - c];
	}
	cout << ans;
	return 0;
}

13.P1105 平台

将其按关键字排序,从后往前不断找,找到即停。初始赋值为0,没有找到则就为0.

#include
using namespace std;
const int N = 2e5 + 10;
int n;
struct node
{
	int h, l, r, num;
}a[N], b[N];
pair ans[N];
bool cmp(node x, node y)
{
	if(x.h != y.h) return x.h < y.h;
	else return x.num > y.num;
}
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i].h >> a[i].l >> a[i].r;
		a[i].num = i;
 	}
	sort(a + 1, a + 1 + n,cmp);
	for(int i = 1; i <= n; i ++)
	{
		int x = 0, y = 0;
		for(int j = i - 1; j >= 1; j --)
		{
			if(a[j].l < a[i].l && a[j].r > a[i].l && a[j].h < a[i].h)
			{
				x = a[j].num;
				break;
			}
		}
		for(int j = i - 1; j >= 1; j --)
		{
			if(a[j].l < a[i].r && a[j].r > a[i].r && a[j].h < a[i].h)
			{
				y = a[j].num;
				break;
			}
		}
		ans[a[i].num] = {x, y};
	}
	for(int i = 1; i <= n; i ++)
	{
		cout << ans[i].first << ' ' << ans[i].second << '\n';
	}
	return 0;
}

14.P1111 修复公路

模板

将时间从小到大进行排序,初始化每一个点为一个集合,如果当前这个点以及所在的集合没有被加入那就将其加入集合,统计集合中点的个数,如果达到值就输出最小时间。

#include
using namespace std;
const int N = 1e5 + 10;
int n, m, pre[N], cnt[N];
struct node
{
	int x, y, t;
}a[N];
bool cmp(node x, node y)
{
	return x.t < y.t;
}
int find(int x)
{
	if(pre[x] != x)pre[x] = find(pre[x]);
	return pre[x];
}
int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++)
	{
		pre[i] = i;
		cnt[i] = 1;
	}
	for(int i = 1; i <= m; i ++)
	{
		cin >> a[i].x >> a[i].y >> a[i].t;
	}
	sort(a + 1, a + 1 + m, cmp);
	for(int i = 1; i <= m; i ++)
	{
		if(find(a[i].x) == find(a[i].y))continue;
		
		cnt[find(a[i].y)] += cnt[find(a[i].x)];
		pre[find(a[i].x)] = find(a[i].y);
		if(cnt[find(a[i].y)] == n)
		{	
			cout << a[i].t;
			return 0;
		}
	}

	cout << -1;
	return 0;
}

15.P1115 最大子段和

#include
using namespace std;
const int N = 2e5 + 10;
int n, a[N], dp[N];
int ans = -1010;
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
	}
	for(int i = 1; i <= n; i ++)
	{
		dp[i] = max(a[i], dp[i - 1] + a[i]);
	}
	for(int i = 1; i <= n; i ++)
	{
		ans = max(ans, dp[i]);
	}
	cout << ans;
	return 0;
}

你可能感兴趣的:(算法,数据结构)