2019 ICPC Universidad Nacional de Colombia Programming Contest

本文解析了CodeForces健身房102307竞赛题目,重点介绍了G题Graduation的解题思路。通过优化选择课程的策略,实现最少学期完成所有课程的目标。

https://codeforc.es/gym/102307

最后5题收尾了,大概率铜。其中有2题是签到手速题。有一题是抄模板的表达式求值,写一个分数类随便过。

比较有趣的是下面的:

G. Graduation

题意:一共有n门课,每门课有至多1门先修课,没有先修课的用0表示。学习一门课的条件是:这个学期选的课不足k门,且这门课的先修课(假如有的话)已经在前面的学期中学过了。求最少需要多少个学期学完。

思路:队友一开始是优先拓展儿子数最多的子结点,我觉得怪怪的,比如一个像蒲公英一样的东西,一开始在周围的大子树浪费时间而不去走茎的话,可能导致最后每个学期只学1门课。

lzf非常厉害不久就想出一个方法。优先判断剩余深度,相同剩余深度的优先拓展儿子数最多的。这个感觉不错。越想越真。随便写一个就草过去了。

转载于:https://www.cnblogs.com/Inko/p/11437649.html

有关于2021 - 2022年及2019年、2020 - 2021年的ICPC拉丁美洲区域编程竞赛的部分信息。2021 - 2022年竞赛包含的题目有F. Fields Division、H.待补、I. Invested Money、J. Joining Pairs、K. KIARA is a Recursive Acronym、M. Most Ordered Way等 [^1]。 2019ICPC拉丁美洲区域竞赛有计蒜客重现,其中一道签到题是模拟题,给出了对应的代码实现 [^2]。 2021 - 2022年竞赛题解中,K题是签到题,也给出了相应的代码 [^3]。 2020 - 2021年竞赛题解涉及判断若干个实数的前缀和不是整数的个数的题目,同样有代码实现 [^4]。 ```python # 以下是2019年竞赛签到题代码 #include <iostream> #include <algorithm> using namespace std; int a[1005],b[1005]; int n,m; int check(int i){ for(int j=i+1;j<n;j++){ if(a[j]-a[i]<=m){ i=j; }else return i; } return n; } int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } int ans=1; for(int i=1;i<=n;i++){ ans=max(ans,check(i)-i+1); } cout<<ans<<endl; return 0; } # 以下是2021 - 2022年竞赛K题代码 #include <iostream> #include <map> #include <vector> std::map<char, int> mp; std::string ss[1000006]; int main() { std::ios::sync_with_stdio(false); // std::cin.tie(0); int t; std::cin >> t; std::string s; for (int i = 1; i<=t; ++i) { std::cin >> ss[i]; mp[ss[i][0]]++; } for (int i = 1; i<=t; ++i) { bool flag = 1; for (char &j:ss[i]) { if (mp[j]<=0) { flag = 0; } } if (flag) { std::cout << "Y";return 0; } } std::cout << "N"; return 0; } # 以下是2020 - 2021年竞赛题解代码 #include <bits/stdc++.h> #define x first #define y second #define pb push_back using namespace std; const int maxn = 10010; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; char c1; int num; string s; while (cin >> n) { int las = 0, ans = 0; for (int i = 1; i <= n + 1; i++) { cin >> c1 >> num >> s; las += ((s[1] - '0') * 10 + s[2] - '0'); if (las % 100 != 0 && i != 1) ans++; } cout << ans << endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值