2024.10.14校测

T1

题目描述

为了庆祝大佬 wxh 的生日,众人决定为他准备礼物。现在有 n 个礼品盒排成一行,从 1n 编号,每个礼品盒中可能有 1 个或 0 个礼品。大佬 wxh 提出了 m 个要求,形如“第 l[i] 到第 r[i] 个礼品盒当中至少有 c[i] 个礼品”。现在众人想知道,为了满足这些要求,所需准备的最少礼品数。

输入格式

第一行两个整数 n,m,接下来 m 行每行三个整数 l[i],r[i],c[i]

输出格式

一行一个整数代表答案。

输入样例

15 5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1

输出样例

6

数据规模

对于 30% 数据,n,m10

对于 100% 数据,n1000,m10000,1l[i],r[i]n,0c[i]r[i]l[i]+1

完整代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9, M = 1e6 + 9;
struct Edge{
	int v, w, nex;
} e[M << 2];
int head[N], ecnt;
void addEdge(int u, int v, int w){
	e[++ecnt] = Edge{v, w, head[u]};
	head[u] = ecnt;
}
int dis[N], tot[N], n, m;
queue <int> q;
bool inq[N];
bool spfa(int s){
	dis[s] = 0;
	q.push(s);
	inq[s] = true;
	while(!q.empty()){
		int u = q.front();
		q.pop();
		inq[u] = false;
		for(int i = head[u]; i; i = e[i].nex){
			int v = e[i].v;
			if(dis[u] + e[i].w > dis[v]){
				dis[v] = dis[u] + e[i].w;
				if(!inq[v]){
					tot[v]++;
					if(tot[v] == n + 1)
						return false;
					q.push(v);
					inq[v] = true;
				}
			}
		}
	}
	return true;
}
int l[M], r[M], c[M], tmp[N];
int main(){
	freopen("a.in", "r", stdin);
	freopen("a.out", "w", stdout);
	scanf("%lld%lld", &n, &m);
	memset(dis, -0x3f, sizeof(dis));
	for(int i = 1; i <= m; i++){
		scanf("%lld%lld%lld", &l[i], &r[i], &c[i]);
		addEdge(l[i] - 1, r[i], c[i]);
	}
	for(int i = 0; i < n; i++){
		addEdge(i, i + 1, 0);
		addEdge(i + 1, i, -1);
	}
	bool flag = spfa(0);
	printf("%lld", dis[n]);
	return 0;
}

T2

题目描述

在实验室中,NathanWada 作为助手的职责是测定两个样品的重量差异。当样品的差异很小时,使用天平比使用弹簧秤能得到更精确的结果,所以 NathanWada 只使用天平来测得一些样品的重量差。NathanWada 偶尔会被询问一些样品的重量差,而他能否回答这些问题取决于在回答相应问题时他已经得到的测量结果。由于 NathanWada 所要处理的测量数据是巨大的,所以他希望你能写个程序帮他处理数据和回答问题。

输入格式

第一行包含两个整数 NM,其中 N 表示样品的数量,样品从 1N 标号。

接下来 M 行,每行包括一个测量结果或者询问,按时间顺序给出。

一个测量结果被格式化为 ! a b w,表示第 a 个样品比第 b 个样品轻 w 个单位重量,且任意的测试结果互不矛盾。

一个询问被格式化为 ? a b,表示询问第 a 个样品比第 b 个样品轻多少个单位重量。

输出格式

对于每个询问输出一行,如果能回答问题,则输出问题的答案,你可以认为答案的绝对值不超过 1000000。否则输出 UNKNOWN,表示不能回答问题。

输入样例

4 7
! 1 2 100
? 2 3
! 2 3 100
? 2 3
? 1 3
! 4 3 150
? 4 1

输出样例

UNKNOWN
100
200
-50

数据规模

对于 30% 数据,N,M1000

对于 100% 数据,1N,M100000,1a,bN

完整代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 9;
int fa[N], dis[N];
int find(int x){
	if(fa[x] == x)
		return x;
	int rt = find(fa[x]);
	dis[x] += dis[fa[x]];
	fa[x] = rt;
	return rt;
}
int n, m;
signed main(){
	freopen("b.in", "r", stdin);
	freopen("b.out", "w", stdout);
	for(int i = 0; i < N; i++)
		fa[i] = i;
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= m; i++){
		char opt[2];
		int x, y, w;
		scanf("%s", opt);
		if(opt[0] == '!'){
			scanf("%lld%lld%lld", &x, &y, &w);
			int fx = find(x);
			int fy = find(y);
			if(fx != fy){
				fa[fx] = fy;
				dis[fx] = dis[y] - dis[x] + w;
			}
		} else {
			scanf("%lld%lld", &x, &y);
			if(find(x) != find(y))
				printf("UNKNOWN\n");
			else
				printf("%lld\n", dis[x] - dis[y]);
		}
	}
	return 0;
}

T3

题目描述

一条单向的铁路线上,依次有编号为 1,2,,nn 个火车站。每个火车站都有一个级别,最低为 1 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠。(注意:起始站和终点站自然也算作事先已知需要停靠的站点)现有 m 趟车次的运行情况(全部满足要求),试推算这 n 个火车站至少分为几个不同的级别。

输入格式

第一行包含 2 个正整数 n,m

接下来 m 行,首先是一个正整数 si2sin),表示第 i 趟车次有 si 个停靠站;接下来有 si 个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个空格隔开。输入保证所有的车次都满足要求。

输出格式

一行一个整数,表示车站最少划分的级别数。

输入样例

9 3
4 1 3 5 6
3 3 5 6
3 1 5 9 

输出样例

3

数据规模

对于 10% 数据,n,m100

对于 40% 数据,n,m5000

对于 100% 数据,n,m100000,所有 si 的和不超过 100000

T4

题目描述

酒吧里有 k 种鸡尾酒,每种的酒精含量(体积分数)为 ai/1000。你想喝到酒精含量为 n/1000 的酒,因此你想要把一些鸡尾酒混合起来以达到目的。混合后酒精含量的定义为所有参与混合的鸡尾酒中酒精的体积和除以所有参与混合的鸡尾酒的体积和。你想知道最少需要购买多少杯鸡尾酒才能满足条件。假设每种鸡尾酒都无限供应,每杯酒的体积都是相同的。

输入格式

第一行两个整数 n,k,意义如上所述。

第二行 k 个整数 ai,表示每种酒的酒精含量。不同酒的酒精含量可能相同。

输出格式

一行一个整数,表示至少需要购买的鸡尾酒杯数。如果无法满足条件,输出 -1

输入样例

50 2
100 25

输出样例

3

样例解释

购买 1 杯第一种鸡尾酒,2 杯第二种鸡尾酒,混合起来即可。

数据规模

对于 30% 数据,k2

对于 100% 数据,0n,ai1000,1k100000

posted @   JPGOJCZX  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示