NOIP模拟 17.8.16

A 债务
文件名 输入文件 输出文件 时间限制 空间限制
debt.pas/c/cpp debt.in debt.out 1s 128MB
【题目描述】
小 G 有一群好朋友,他们经常互相借钱。假如说有三个好朋友 A,B,C。A
欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元。小 G 是个追求简约的人,
他觉得这样的债务太繁杂了。他认为,上面的债务可以完全等价为 A 欠 C 20 元,
B 既不欠别人,别人也不欠他。这样总债务规模就压缩到了 20 元。
现在给定 n 个人和 m 条债务关系。小 G 想找到一种新的债务方案,使得每个
人欠钱的总数不变,或被欠钱的总数不变(但是对象可以发生变化),并且使得总
债务规模最小。
【输入格式】
输入文件第一行两个数字 n, m,含义如题目所述。
接下来 m 行,每行三个数字 ai
, bi, ci,表示 ai 欠 bi 的钱数为 ci。
注意,数据中关于某两个人 A 和 B 的债务信息可能出现多次,将其累加即可。
如”A 欠 B 20 元”、”A 欠 B 30 元”、”B 欠 A 10 元”,其等价为”A 欠 B 40 元”。
【输出格式】
输出文件共一行,输出最小的总债务规模。
【样例输入 1】
5 3
1 2 10
2 3 1
2 4 1
【样例输出 1】
10
【样例输入 2】
4 3
1 2 1
2 3 1
3 1 1
【样例输出 2】
0
【数据范围】
对于 30% 的数据,1 ≤ n ≤ 10,1 ≤ m ≤ 10。
对于 60% 的数据,1 ≤ n ≤ 100, 1 ≤ m ≤ 104。
对于 80% 的数据,1 ≤ n ≤ 104,1 ≤ m ≤ 104。
对于 100% 的数据,1 ≤ n ≤ 106,1 ≤ m ≤ 106。
对于所有的数据,保证 1 ≤ ai, bi ≤ n, 0 < ci ≤ 100。

【题解】

水题,略,注意细节,想清楚

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <iostream>
 5
 6 const int MAXN = 100 + 10;
 7
 8 inline void read(int &x)
 9 {
10     x = 0;char ch = getchar(), c = ch;
11     while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar();
12     while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
13     if(c == ‘-‘)x = -x;
14 }
15
16 char s[MAXN][MAXN];int n, ok;
17
18 int check(int x, int y)
19 {
20     if(s[x][y] == ‘.‘)return 0;
21     if(x == n || x == n - 1)return 1;
22     if(y == 1 || y == n)return 1;
23     if(s[x + 1][y] == ‘.‘ || s[x + 2][y] == ‘.‘ || s[x + 1][y - 1] == ‘.‘ || s[x + 1][y + 1] == ‘.‘)return 1;
24     s[x][y] = s[x + 1][y] = s[x + 2][y] = s[x + 1][y - 1] = s[x + 1][y + 1] = ‘.‘;
25     return 0;
26 }
27
28 int main()
29 {
30     read(n);
31     for(register int i = 1;i <= n;++ i) scanf("%s", s[i] + 1);
32     for(register int i = 1;i <= n;++ i)
33     {
34         for(register int j = 1;j <= n;++ j)
35             if(check(i, j))
36             {
37                 ok = 1;
38                 break;
39             }
40         if(ok)break;
41     }
42     if(ok)printf("NO");
43     else printf("YES");
44     return 0;
45 }

T1

B 小 Z 搭积木
文件名 输入文件 输出文件 时间限制 空间限制
box.cpp box.in box.out 2s 128MB
【题目描述】
小 Z 喜欢搭积木。小 Z 一共有 n 块积木,并且积木只能竖着一块一块的摞,可
以摞多列。小 Z 的积木都是智能积木,第 i 块积木有一个情绪值 Xi。当摞在该积
木上面积木总数超过 Xi 时,i 号积木就会不高兴。小 Z 情商这么高,肯定不希望
有积木不高兴。但是他又希望每块积木都被用上,并且摞的积木列的总数最少。你
能帮帮萌萌的小 Z 吗?
【输入格式】
输入文件第一行一个数字 n,含义如题目所述。
第 2 行一共 n 个数,第 i 个数为 Xi,含义如题目所述。
【输出格式】
输出一个数字,表示最小的积木列数目。
【样例输入 1】
3
0 0 10
【样例输出 1】
2
4
【样例输入 2】
4
0 0 0 0
【样例输出 2】
4
【数据范围】
30% 数据,1 ≤ n ≤ 10
60% 数据,1 ≤ n ≤ 100
80% 数据,1 ≤ n ≤ 1000
100% 数据,1 ≤ n ≤ 5000
对于所有数据点,都有 Xi ≤ n

【题解】

我的方法是二分答案降序贪心放。

标解是这样的:

先将所有的盒子按照承载量从小到大排序。然后我们开一个数组,

记录一下当前一共有多少列,每一列一共有多少个盒子。从小到

大扫描所有的盒子,找到能放下的数量最多的列,放进去。如果没

有任何一列能放下,则建一个新列。 ——SD Ag爷 ty哥哥

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define min(a, b) ((a) < (b) ? (a) : (b))

const int MAXN = 5000 + 10;

inline void read(int &x)
{
    x = 0;char ch = getchar(), c = ch;
    while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar();
    while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
    if(c == ‘-‘)x = -x;
}

int n, x[MAXN], ans, cnt[MAXN];

int check(int now)
{
    memset(cnt, 0x3f, sizeof(cnt));
    int p = 1, ok = 1;
    while(p <= n)
    {
        ok = 1;
        for(register int i = 1;i <= now;++ i)
        {
            if(!cnt[i])continue;
            cnt[i] = min(cnt[i] - 1, x[p]), ++p, ok = 0;
        }
        if(ok)return 0;
    }
    return 1;
}

int main()
{
    read(n);
    for(register int i = 1;i <= n;++ i) read(x[i]);
    std::sort(x + 1, x + 1 + n, std::greater<int>());
    register int l = 1, r = n, mid;
    while(l <= r)
    {
        mid = ((l + r) >> 1);
        if(check(mid))r = mid - 1;
        else l = mid + 1;
    }
    printf("%d", l);
    return 0;
}

T2

C 分宿舍
文件名 输入文件 输出文件 时间限制 空间限制
love.cpp love.in love.out 1s 128MB
【题目描述】
A 校有着神奇的住宿制度,不分男女宿舍,所有 n 个学生被统一分到两栋宿舍
楼中。作为年轻人,学生之间心生爱慕之情是很正常。我们用爱慕值来表示两名学
生之间的爱慕程度,如果两名爱慕值为 c 的学生被安排在同一宿舍楼,他们或她们
便会在一起,并造成影响力为 c 的早恋事件。
每年年末,身为政教处主任的你会将所有早恋事件按照影响力从大到小排成一
个列表,然后上报给校长。公务繁忙的校长只会去看列表中第一个事件的影响力,
如果影响很大,他会考虑撤换政教处主任。
在详细考察了 n 个学生之间的爱慕关系后,你觉得压力很大。你要合理的将学
生们分到两栋宿舍,以求产生的早恋事件影响力都比较小,以保住自己的官职。假
设只要处于同一栋宿舍楼的两个人之间有爱慕关系,他们就一定会在这年的某个时
候在一起。
那么,要怎么分配,才能让校长看到的那个早恋事件的影响力最小呢?这个最
小值是多少?
【输入格式】
第一行两个整数 n 和 m,分别表示学生的数目和爱慕关系的对数。
接下来 m 行,每行为 3 个正整数 ai,bi,ci,表示学生 ai 和 bi 之间有爱慕关
系,爱慕值为 ci。
数据保证 1 ≤ ai ≤ bi ≤ n,0 < ci ≤ 109,且每对爱慕关系只出现一次。
【输出格式】
输出一个数,为通过合理安排,校长看到的那个早恋事件的最小影响力。如果
没有发生早恋事件,输出 0。
6
【样例输入】
4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884
【样例输出】
3512
【数据范围】
对于 30% 的数据,n ≤ 15。
对于 70% 的数据,n ≤ 2000,m ≤ 50000。
对于 100% 的数据,n ≤ 20000,m ≤ 100000。

【题解】

并查集裸题。

1. 普通并查集
i表示第i个学生,i+n为虚拟节点,表示不能和i在一个宿舍的人
若两个点在同一并查集中,说明它们必须被分到同一个宿舍楼
将所有的爱慕关系从大到小排序
若a和b在同一并查集中,则此时c为答案
若不在同一并查集,令a与b+n所在并查集合并,b与a+n所在并查集合并
2. 加权并查集
同样将所有爱慕关系从大到小排序
每个点存储额外信息type,type为0表示和父亲结点在同一个宿舍楼,1表示和父亲结点不在同一个宿舍楼
合并与查询的方式类似食物链

3. 二分+dfs
二分答案
对于比二分答案大的爱慕关系,建图,显然若该图可以黑白染色,该答案可行;反之不可行

——gty

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6
 7 const int MAXN = 20000 + 10;
 8
 9 inline void read(int &x)
10 {
11     x = 0;char ch = getchar(), c = ch;
12     while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar();
13     while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
14     if(c == ‘-‘)x = -x;
15 }
16
17 int n,m,fa[MAXN << 2],a[MAXN],b[MAXN],c[MAXN],cnt[MAXN];
18
19 int find(int x)
20 {
21     return x == fa[x] ? x : fa[x] = find(fa[x]);
22 }
23
24 int cmp(int a, int b)
25 {
26     return c[a] > c[b];
27 }
28
29 int main()
30 {
31     read(n), read(m);
32     register int tmp1, tmp2, tmp3, p1, p2, pp1, pp2;
33     for(register int i = (n << 1);i >= 1;-- i)fa[i] = i;
34     for(register int i = 1;i <= m;++ i)read(a[i]), read(b[i]), read(c[i]), cnt[i] = i;
35     std::sort(cnt + 1, cnt + 1 + m, cmp);
36     for(register int i = 1;i <= m;++ i)
37     {
38         tmp1 = a[cnt[i]], tmp2 = b[cnt[i]], tmp3 = c[cnt[i]];
39         p1 = find(tmp1 << 1), p2 = find(tmp2 << 1);
40         pp1 = find(tmp1 << 1 | 1), pp2 = find(tmp2 << 1 | 1);
41         if(pp1 == pp2)
42         {
43             printf("%d", tmp3);
44             return 0;
45         }
46         fa[pp2] = p1;
47         fa[pp1] = p2;
48     }
49     printf("0");
50     return 0;
51 }

T3

时间: 2024-12-29 11:21:10

NOIP模拟 17.8.16的相关文章

NOIP模拟17.8.17

NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 k 种字母.要求满足:• 字符串中相邻的两个字母不能相同.• 必须出现恰好 k 种不同的字母.这样的合法字符串可能有很多,小 L 让小 G 输出字典序最小的那个.小 G 太笨啦,不会做这道题,希望你帮帮他.[输入格

NOIP模拟 17.8.18

NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也需要一定量的草作为饲料对于第 i头奶牛来说,它每天可以产 vi升的奶,同时需要 wi千克的草作为饲料现在来自蚯蚓国的九条可怜想借一些奶牛,使借走的这些奶牛每天的总产奶量最大,但九条可怜很穷,每天最多只能提供W千克的草作为饲料,而且她还需要对付跳蚤国的神刀手,所以她把这个问题交给了阿强巴,不不不……阿

NOIP模拟17.9.21

NOIP模拟17.9.21 1 任务安排manage.in/.out/.cpp1.1 问题描述你有N 个工作,同一时刻只能做一个任务, 其中每个工作有其所需时间, 及完成的Deadline(截止时间), 问要完成所有工作, 最迟要从什么时候开始.你最早可以从时间0 开始工作.1.2 输入格式第一行一个整数N,表示任务数量接下来n 行,每行两个整数,Ti; Si,分别表示该任务的持续时间和截止时间.1.3 输出格式输出一个整数,表示最晚的开始时间,如果不能完成,输出-1.1.4 样例输入43 58

NOIP模拟17.9.22

NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥ ??的位置去,但很不幸数轴上有??个区间是禁区,不能进入.青蛙会选择一个长度??,从原点开始每次向右跳长度为??的一段.一路上青蛙会停的位置是0, ??, 2??,…直到跳到了≥ ??的位置,任意一个位置都不能在禁区中.请求出??的最小值,注意??可以是实数.[输入格式]输入文件为susume.in.输入文件的第一行包含两个整数??和??,含义如问题描述中所述.接下来??行,每行描述一个禁区.每行有两个整数

NOIP模拟 17.9.28

公交车[问题描述]市内有??个路口和??条双向道路,每条道路都有过路费,第??条道路的过路费为??%元.市内还有??条公交线路,公交车只在路口停靠,而且一路公交车只会沿着固定的线路往返行驶.上第??路公交车需要??%元的费用,但费用是一次性的,即你可以在公交线路上的任意停靠路口下车.但是一旦下车了,如果要再次上车,则还需要再次付费.现在你在路口??,你想知道从??出发到其它每个路口的最小费用是多少.[输入格式]输入的第一行包含四个整数??.??.??和??,分别代表路口数.道路数.公交线路数和你

NOIP模拟 6.28

NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(type操作) 2.U x:撤销最后的x次修改操作.(Undo操作) (注意Query操作并不算修改操作) 3.Q x:询问当前文章中第x个字母并输出.(Query操作) 文章一开始可以视为空串. [输入格式]

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

liu_runda 给辣鸡蒟蒻做的 NOIP模拟赛 1.0 第二题 任(duty) 题解

问题 B: 任(duty) 时间限制: 2 Sec  内存限制: 512 MB 题目描述 liu_runda退役之后就失去梦想开始咸鱼生活了- Bilibili夏日画板活动中,所有人都可以在一块画板上进行像素画创作.UOJ群有一群无聊的人决定在画板上创作一个50*50的UOJ的LOGO.如下图. 这块画板实际上是很大的矩形网格.一个网格是一像素. 一个人每三分钟才能画一个像素.所以liu_runda的咸鱼生活非常无聊. 郭神表示他实在是看不下去liu_rudna这只颓狗了,于是随手出了一道神题,

noip模拟测试11

T1:string 第一眼秒出思路,这不就是排序那道题的加强版吗? 然而歪?解复杂度虽然是对的,但常数过大,竟被卡到70 歪?解:(实际上std写的就是这个,但据说std被卡掉了 OAO) 因为字符集很小,所以我们可以把区间排序改为区间查询和覆盖 即:先查询区间内所有字符的个数,再从左端点开始按照大小关系依次将长度为字符个数的区间修改为该字符. 期望复杂度O ( 26*mlogn ),实际复杂度O ( 26*mlogn*(巨大的常数) ) 所以需要一(feng)定(kuang)的卡常 正?解: