Codeforces Round #429 (Div. 2) 补题
A. Generous Kefa
题意:n个气球分给k个人,问每个人能否拿到的气球都不一样
解法:显然当某种气球的个数大于K的话,就GG了。
- #include <bits/stdc++.h>
- using namespace std;
- int cnt[110];
- char s[110];
- int main()
- {
- int n,k;
- scanf("%d%d",&n,&k);
- scanf("%s", s);
- int len = strlen(s);
- for(int i=0; i<len; i++){
- cnt[s[i]-'A']++;
- }
- for(int i=0; i<110; i++){
- if(cnt[i]>k){
- puts("NO");
- return 0;
- }
- }
- puts("YES");
- return 0;
- }
B. Godsend
题意:两个玩一个小游戏,有一个序列,第一个人只能取走和为奇数的子序列,第二个只能取走和为偶数的子序列,谁不能移动谁就输了,问最后谁赢了。
解法:如果和为奇数的话,第一个取完直接赢,考虑和为偶数的,如果全是偶数第二个人赢,否则第一个人稳赢
- #include <bits/stdc++.h>
- using namespace std;
- int n;
- int a[1000010];
- int main()
- {
- scanf("%d", &n);
- long long sum = 0;
- for(int i=1; i<=n; i++){
- scanf("%d", &a[i]);
- sum += a[i];
- }
- if(sum%2==1){
- puts("First");
- }
- else{
- int cnt = 0;
- for(int i=1; i<=n; i++){
- if(a[i]%2==1){
- puts("First");
- return 0;
- }
- }
- puts("Second");
- }
- return 0;
- }
C. Leha and Function
题意:定义F(n,k)表示1-n的排列里面选出k个不同的数的最小值,给了两个序列A,B,问如何安排A序列的顺序使得F(Ai',BI)的和的最大值。
解法:一个简单的贪心,就是N越大我们让K越小就好啦。
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 2e5+5;
- int n;
- struct node{
- int x,id;
- node(){}
- node(int x, int id):x(x),id(id){}
- }a[maxn],b[maxn];
- bool cmp(node x, node y){
- return x.x < y.x;
- }
- bool cmp2(node x, node y){
- return x.x > y.x;
- }
- map <int,int> mp;
- int aa[maxn];
- int main()
- {
- scanf("%d", &n);
- for(int i=1; i<=n; i++) scanf("%d", &a[i].x), a[i].id = i,aa[i]=a[i].x;
- for(int i=1; i<=n; i++) scanf("%d", &b[i].x), b[i].id = i;
- sort(a+1, a+n+1, cmp2);
- sort(b+1, b+n+1, cmp);
- for(int i=1; i<=n; i++){
- mp[b[i].id] = a[i].id;
- }
- for(int i=1; i<=n; i++){
- printf("%d ", aa[mp[i]]);
- }
- printf("\n");
- return 0;
- }
D. Leha and another game about graph
题意:给出一个连通图,并给每个点赋一个d值0或1或-1,要求选出一个边的集合,使得所有的点i要么d[i] == -1,要么dgree[i] % 2 == d[i],dgree[i]代表i结点的度数。
题解来源:http://blog.csdn.net/lxy767087094/article/details/77434503
解法:好题啊,当时没想出来,然后膜了一发题解的方法被惊艳到了。下面的描述来自上面博客:首先我们考虑一条边都不选的情况,此时所有d[i] == 0的i都满足了题目要求,此时如果有d[i] == 1的点,我们就要加一条边,我们考虑用dfs维护这个过程,在dfs序形成的搜索树上,若对于某个节点u,其子节点v有d[v] == 1,那么我们就将u和v之间的边的选取状态取反,即原来选变成不选,不选变成选,然后令d[v] = 0,代表该节点已经满足题意(你愿意赋值成其他值也无所谓,注意别弄混就行),若d[u] != -1,那么d[u]取反(因为u增加了一度,满足题意的状态肯定变化),可以发现,对于每个点,都能通过改变其和其父节点之间边的选取状态而改变其满足题意的状态,只有根节点没有父节点而例外,因此dfs完成后,如果根节点的状态为d[root] == 1,那么我们就要再选取一个d[i] == -1的结点i,将其到父节点的路径上所有边的选取状态取反,这样只会改变i和root结点的度数,路径上其他结点的度数并不受影响(因此满足题意的状态也不会改变),而对i来说度数改变是无所谓的,因此这样就只将d[root]变成了0。
那么什么时候输出-1呢,显然当不存在d[i] == -1的i并且d[root] == 1的时候,我们就无力回天了。
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 3e5+5;
- typedef pair<int,int> P;
- vector <P> G[maxn];
- P fa[maxn];
- int n, m, node, d[maxn];
- bool vis[maxn], select[maxn];
- void dfs(int u){
- int v, id;
- vis[u] = 1;
- for(int i=0; i<G[u].size(); i++){
- v = G[u][i].first;
- id = G[u][i].second;
- if(vis[v]) continue;
- fa[v] = make_pair(u, id);
- dfs(v);
- if(d[v] == 1){
- d[v] = 0;
- select[id] ^= 1;
- if(d[u] != -1) d[u] ^= 1;
- }
- }
- }
- int main()
- {
- scanf("%d %d", &n,&m);
- for(int i=1; i<=n; i++){
- scanf("%d", &d[i]);
- if(d[i]==-1) node=i;
- }
- for(int i=1; i<=m; i++){
- int u, v;
- scanf("%d %d", &u,&v);
- G[u].emplace_back(v, i);
- G[v].emplace_back(u, i);
- }
- dfs(1);
- if(d[1] == 1){
- if(node == 0){
- puts("-1");
- return 0;
- }
- while(node != 1){
- select[fa[node].second] ^= 1;
- node = fa[node].first;
- }
- }
- int ans = 0;
- for(int i=1; i<=m; i++){
- if(select[i]) ans++;
- }
- printf("%d\n", ans);
- for(int i=1; i<=m; i++){
- if(select[i]){
- printf("%d ", i);
- }
- }
- printf("\n");
- return 0;
- }
E. On the Bench
题意:给出n个数,要求把他们重新排列之后,没有相邻的数的乘积是完全平方数
解法:从MPS的代码里学了一种容斥的方法:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- const int maxn = 305;
- const LL mod = 1e9+7;
- LL dp[2][maxn];
- LL C[maxn][maxn];
- LL n, fac[maxn], Inv[maxn];
- LL inv(LL a){
- return a == 1 ? 1 : ((mod-mod/a)*inv(mod%a))%mod;
- }
- void pre_deal()
- {
- for(int i=0; i<=300; i++){
- C[i][0]=1;
- for(int j=1; j<=i; j++){
- C[i][j] = C[i-1][j]+C[i-1][j-1];
- if(C[i][j]>=mod) C[i][j]%=mod;
- }
- }
- fac[0]=Inv[0]=1;
- for(int i=1; i<=300; i++)
- fac[i]=fac[i-1]*i%mod,Inv[i]=inv(fac[i]);
- }
- map <vector<LL>, LL> mp;
- int main()
- {
- pre_deal();
- cin >> n;
- for(int i=1; i<=n; i++){
- LL x;
- cin >> x;
- vector <LL> v;
- for(LL d=2; d*d<=x; d++){
- if(x%d==0){
- LL jud = 0;
- while(x%d == 0) x/=d, jud^=1;
- if(jud) v.push_back(d);
- }
- }
- if(x>1) v.push_back(x);
- mp[v]++;
- }
- memset(dp, 0, sizeof(dp));
- dp[0][0] = 1;
- LL now = 0, pre = 1;
- for(auto it : mp){
- LL cnt = it.second;
- swap(now, pre);
- memset(dp[now], 0, sizeof(dp[now]));
- for(LL i=1; i<=n; i++){
- for(LL j=1; j<=min(cnt,i); j++){
- dp[now][i] += (dp[pre][i-j] * (((fac[cnt] * Inv[j])%mod * C[cnt-1][j-1])%mod))%mod;
- if(dp[now][i]>=mod) dp[now][i]%=mod;
- }
- }
- }
- LL ans=0;
- for(LL i=1; i<=n; i++){
- ans += (((n-i&1)?(mod-1):1)%mod*fac[i]%mod)*dp[now][i]%mod;
- if(ans>=mod) ans-=mod;
- }
- printf("%lld\n", ans);
- return 0;
- }
Codeforces Round #429 (Div. 2) 补题的更多相关文章
- Codeforces Round #412 Div. 2 补题 D. Dynamic Problem Scoring
D. Dynamic Problem Scoring time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- Codeforces Round #585 (Div. 2) [补题]
前言 2019.9.16 昨天下午就看了看D题,没有写对,因为要补作业,快点下机了,这周争取把题补完. 2019.9.17 这篇文章或者其他文章难免有错别字不被察觉,请读者还是要根据意思来读,不要纠结 ...
- Codeforces Round #786 (Div. 3) 补题记录
小结: A,B,F 切,C 没写 1ll 对照样例才发现,E,G 对照样例过,D 对照样例+看了其他人代码(主要急于看后面的题,能调出来的但偷懒了. CF1674A Number Transforma ...
- Codeforces Round #419 (Div. 1) 补题 CF 815 A-E
A-C传送门 D Karen and Cards 技巧性很强的一道二分优化题 题意很简单 给定n个三元组,和三个维度的上限,问存在多少三元组,使得对于给定的n个三元组中的每一个,必有两个维度严格小于. ...
- Codeforces Round #590 (Div. 3)补题
要想上2000分,先刷几百道2000+的题再说 ---某神 题目 E F 赛时是否尝试 × × tag math bitmask 难度 2000 2400 状态 ∅ √ 解 E 待定 F 传送门 第一 ...
- Codeforces Round #574 (Div. 2)补题
A. Drinks Choosing 统计每种酒有多少人偏爱他们. ki 为每种酒的偏爱人数. 输出ans = (n + 1)/2 > Σki / 2 ? (n + 1)/2 - Σki / ...
- Codeforces Round #615 (Div. 3) 补题记录
第一次搞CF,结果惨不忍睹...还是太菜了 A:要用到全部的钱,所以总数必须是3的倍数,而且初始状态下任意一人的钱数不能超过总数除以3,否则没法分了 (也就这个签到算是在我能力范围之内了....) # ...
- Codeforces Round #617 (Div. 3) 补题记录
1296A - Array with Odd Sum 题意:可以改变数组中的一个数的值成另外一个数组中的数,问能不能使数组的和是个奇数 思路:签到,如果本来数组的和就是个奇数,那就OK 如果不是,就需 ...
- Codeforces Round #378 (Div. 2) D题(data structure)解题报告
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
随机推荐
- icon button样式(类似windows桌面图标)
<Style x:Key="IconButton" TargetType="{x:Type Button}"> <Setter Propert ...
- 新篇章之我的java学习之路上
现在我怀着激动和兴奋的心情来写我的第一篇博客,谈谈我自己的学习java的这段历程. 我大学学的软件工程专业,学校开设过c++,数据结构,java,Android等等这类的关于开发的相关课程,但是在学校 ...
- Intellij Idea配置说明(从Eclipse转Idea)
1.idea的字体大小设置 字体大小设置的方法: 进入Settings>>Editor>>Colors&Fonts>>Font,改变Size大小. 2. ...
- Akka(14): 持久化模式:PersistentActor
Akka程序的特点之一就是高弹性或者强韧性(resilient)的,因为Actor具有自我修复的能力.当Actor模式的程序出现中断情况如:系统崩溃.人为终结等,系统在重启后有关Actor可以恢复之前 ...
- Python项目实战:福布斯系列之数据采集
1 数据采集概述 开始一个数据分析项目,首先需要做的就是get到原始数据,获得原始数据的方法有多种途径.比如: 获取数据集(dataset)文件 使用爬虫采集数据 直接获得excel.csv及其他数据 ...
- C/C++中static的用法全局变量与局部变量
1.什么是static? static 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1static的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它 ...
- luogu P3398 仓鼠找sugar [LCA]
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...
- python函数(1):初始函数
在学了前面很多python的基础类型后,我们终于可以进入下一阶段,今天我们将走进一个函数的新世界. 预习: 1.写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数 2.写函数, ...
- pb日志查看记录
因为日志的种类比较多,这里记录下来,方便查看! 1 pb下发日志查看 目前已经确定220-224 603都是这么查看的.手工下发的业务应该都是这么查看的,其实只要去确定步骤2中的序号,就可以直接进入步 ...
- iOS开发实战-上架AppStore 通过内购和广告获得收益
写在前面 由于一些原因需要离职,准备重回大上海 忽然发现手头上也没什么独立App,那就随便写个放到AppStore上吧,凑个数吧.哈哈哈. 这个App是无聊找配色的时候看到的一套图 正好春节在家没什么 ...