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 = + ;
  7.  
  8. inline void read(int &x)
  9. {
  10. x = ;char ch = getchar(), c = ch;
  11. while(ch < '' || ch > '')c = ch, ch = getchar();
  12. while(ch <= '' && ch >= '')x = x * + ch - '', 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 ;
  21. if(x == n || x == n - )return ;
  22. if(y == || y == n)return ;
  23. if(s[x + ][y] == '.' || s[x + ][y] == '.' || s[x + ][y - ] == '.' || s[x + ][y + ] == '.')return ;
  24. s[x][y] = s[x + ][y] = s[x + ][y] = s[x + ][y - ] = s[x + ][y + ] = '.';
  25. return ;
  26. }
  27.  
  28. int main()
  29. {
  30. read(n);
  31. for(register int i = ;i <= n;++ i) scanf("%s", s[i] + );
  32. for(register int i = ;i <= n;++ i)
  33. {
  34. for(register int j = ;j <= n;++ j)
  35. if(check(i, j))
  36. {
  37. ok = ;
  38. break;
  39. }
  40. if(ok)break;
  41. }
  42. if(ok)printf("NO");
  43. else printf("YES");
  44. return ;
  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哥哥

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. #define min(a, b) ((a) < (b) ? (a) : (b))
  7.  
  8. const int MAXN = + ;
  9.  
  10. inline void read(int &x)
  11. {
  12. x = ;char ch = getchar(), c = ch;
  13. while(ch < '' || ch > '')c = ch, ch = getchar();
  14. while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
  15. if(c == '-')x = -x;
  16. }
  17.  
  18. int n, x[MAXN], ans, cnt[MAXN];
  19.  
  20. int check(int now)
  21. {
  22. memset(cnt, 0x3f, sizeof(cnt));
  23. int p = , ok = ;
  24. while(p <= n)
  25. {
  26. ok = ;
  27. for(register int i = ;i <= now;++ i)
  28. {
  29. if(!cnt[i])continue;
  30. cnt[i] = min(cnt[i] - , x[p]), ++p, ok = ;
  31. }
  32. if(ok)return ;
  33. }
  34. return ;
  35. }
  36.  
  37. int main()
  38. {
  39. read(n);
  40. for(register int i = ;i <= n;++ i) read(x[i]);
  41. std::sort(x + , x + + n, std::greater<int>());
  42. register int l = , r = n, mid;
  43. while(l <= r)
  44. {
  45. mid = ((l + r) >> );
  46. if(check(mid))r = mid - ;
  47. else l = mid + ;
  48. }
  49. printf("%d", l);
  50. return ;
  51. }

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 = + ;
  8.  
  9. inline void read(int &x)
  10. {
  11. x = ;char ch = getchar(), c = ch;
  12. while(ch < '' || ch > '')c = ch, ch = getchar();
  13. while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
  14. if(c == '-')x = -x;
  15. }
  16.  
  17. int n,m,fa[MAXN << ],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 << );i >= ;-- i)fa[i] = i;
  34. for(register int i = ;i <= m;++ i)read(a[i]), read(b[i]), read(c[i]), cnt[i] = i;
  35. std::sort(cnt + , cnt + + m, cmp);
  36. for(register int i = ;i <= m;++ i)
  37. {
  38. tmp1 = a[cnt[i]], tmp2 = b[cnt[i]], tmp3 = c[cnt[i]];
  39. p1 = find(tmp1 << ), p2 = find(tmp2 << );
  40. pp1 = find(tmp1 << | ), pp2 = find(tmp2 << | );
  41. if(pp1 == pp2)
  42. {
  43. printf("%d", tmp3);
  44. return ;
  45. }
  46. fa[pp2] = p1;
  47. fa[pp1] = p2;
  48. }
  49. printf("");
  50. return ;
  51. }

T3

NOIP模拟 17.8.16的更多相关文章

  1. NOIP模拟17.9.21

    NOIP模拟17.9.21 3 58 145 201 161.5 样例输出21.6 数据规模及约定对于40% 的数据,N <= 20对于60% 的数据,N <= 1000对于100% 的数 ...

  2. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  3. NOIP模拟 17.8.20

    NOIP模拟17.8.20 A.阶乘[题目描述]亲爱的xyx同学正在研究数学与阶乘的关系,但是他喜欢颓废,于是他就制作了一个和阶乘有关系的数学游戏:给出两个整数 n,m,令 t = !n,每轮游戏的流 ...

  4. NOIP模拟 17.8.18

    NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也 ...

  5. NOIP模拟 17.8.15

    NOIP模拟17.8.15 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...

  6. NOIP模拟 17.8.17

    NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 ...

  7. NOIP模拟 17.8.14

    NOIP模拟17.8.14 (天宇哥哥考察细心程度的题) [样例解释]如果删去第一个 1:在[3,1,2]中有 3 个不同的数如果删去 3:在[1,1,2]中有 2 个不同的数如果删去第二个 1:在[ ...

  8. Noip模拟17 2021.7.16

    我愿称这场考试为STL专练 T1 世界线 巧妙使用$bitset$当作vis数组使用,内存不会炸,操作还方便,的确是极好的. 但是这个题如果不开一半的$bitset$是会炸内存的,因为他能开得很大,但 ...

  9. NOIP模拟 17.9.28

    公交车[问题描述]市内有

随机推荐

  1. 在HBase之上构建SQL引擎

  2. 对CNN感受野一些理解

    对CNN感受野一些理解 感受野(receptive field)被称作是CNN中最重要的概念之一.为什么要研究感受野呐?主要是因为在学习SSD,Faster RCNN框架时,其中prior box和A ...

  3. js实现事件委托

    事件委托的概念: 事件委托就是利用事件冒泡,把事件加到父元素或祖先元素上,触发执行效果. 事件委托的写法: btn6.onclick = function(event){ event = event ...

  4. extern关键字及C\C++相互调用

    extern关键字主要修饰变量或函数,表示该函数可以跨文件访问,或者表明该变量在其他文件定义,在此处引用. 1.extern修饰变量 (1)如果某变量int m在a.c中定义声明,则其他b.c文件访问 ...

  5. hihocoder 1084 (哈希)

    题目链接 时间限制:4000ms 单点时限:4000ms 内存限制:256MB 描述 你知道KMP吗?它是用于判断一个字符串是否是另一个字符串的子串的算法.今天我们想去扩展它. 在信息理论中,在两个相 ...

  6. 仓库盘点功能-ThinkPHP_学习随笔

    public function check() { $db = M('Bookinfo'); $region = I('post.region'); $c = $db -> count(); f ...

  7. MySQL实战总结

    极客上买了<MySQL实战45讲>,用导图大致总结后,跟大家分享下

  8. MYSQL中使用事务的案例

    基本介绍 事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败.如:网上转账就是典型的要用事务来处理,用以保证数据的一致性. 关键词 start tran ...

  9. js 之 call 、 apply

    在学习js过程中怎么也绕不过用到call.apply方法,感觉都差不多,现在看看他们的用法,区别 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(conte ...

  10. PHP之文件的锁定、上传与下载的方法

    1.文件锁定 现在都在讲究什么分布式.并发等,实际上文件的操作也是并发的,在网络环境下,多个用户在同一时刻访问页面,对同一服务器上的同一文件进行着读取,如果,这个用户刚好读到一半,另一个用户就写入了消 ...