Codeforces 1068 - A/B/C/D/E - (Done)
链接:http://codeforces.com/contest/1068
A - Birthday - [计算题]
题意:一共 $N$ 种硬币,我已经有其中 $K$ 种,我的 $M$ 个朋友每人送我等数量的硬币,且送来的每一枚硬币都不属于同一种,要求最后我收到手上的硬币至少有 $L$ 种是我没有的,求每个人最少送几枚硬币。
题解:即求满足 $K + L \le aM \le N$ 的最小正整数 $a$。
AC代码:
- #include<bits/stdc++.h>
- typedef long long ll;
- using namespace std;
- ll n,m,k,l;
- int main()
- {
- cin>>n>>m>>k>>l;
- if(m>n)
- {
- cout<<-<<endl;
- return ;
- }
- if(k+l<=m)
- {
- cout<<<<endl;
- return ;
- }
- ll a;
- if((k+l)%m==) a=(k+l)/m;
- else a=(k+l)/m+;
- if(a*m>n) cout<<-<<endl;
- else cout<<a<<endl;
- }
B - LCM - [求因数个数]
题意:给定正整数 $b(b \le 10^{10})$,对于 $1 \le a \le 10^{18}$,求 $\frac{{{\mathop{\rm lcm}\nolimits} (a,b)}}{a}$ 的不同取值个数。
题解:$\frac{{{\mathop{\rm lcm}\nolimits} (a,b)}}{a} = \frac{{ab}}{{a\gcd (a,b)}} = \frac{b}{{\gcd (a,b)}}$,即求 $b$ 的因数个数。
AC代码:
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- ll n;
- int main()
- {
- cin>>n;
- ll cnt=;
- for(ll i=;i*i<=n;i++)
- {
- if(n%i==)
- {
- if(i*i==n) cnt++;
- else cnt+=;
- }
- }
- cout<<cnt<<endl;
- }
C - Colored Rooks - [构造题]
题意:
给定一个 $10^9 \times 10^9$ 的正方形网格,现有 $n$ 种颜色,给若干个棋子上色(每种颜色都要涂至少一个棋子),又给出 $m$ 个颜色对 $(x,y)$ 表示这两个颜色是协调的。
现在对于同一种颜色内的棋子集合,以及两个和谐的颜色对构成的棋子并集,都要满足连通性质,该性质的意思即:“首先规定棋子只可以走直线的任意距离,且可以完全不理睬非同集合内的棋子,但只有当它遇到同集合内的另一个棋子时才可以转弯。而该集合中任意一个棋子,都它可以走到集合内的任意其他棋子的位置。”
现在你要给出任意一种可行的放置棋子的方案。
题解:
首先,第 $i$ 行全部给第 $i$ 种颜色,不得放其他颜色。为了防止某种颜色没有涂棋子,可以先在 $(i,i)$ 位置放上颜色为 $i$ 的棋子。
然后对于给出的任意两个协调颜色,依次在后面的 $n+1, n+2, \cdots$ 列里放上对应行数的两枚棋子。
AC代码:
- #include<bits/stdc++.h>
- using namespace std;
- int n,m;
- vector<int> ans[];
- int main()
- {
- cin>>n>>m;
- for(int i=;i<=n;i++) ans[i].push_back(i);
- int col=n+;
- for(int i=,u,v;i<=m;i++)
- {
- scanf("%d%d",&u,&v);
- if(u==v) continue;
- ans[u].push_back(col);
- ans[v].push_back(col);
- col++;
- }
- for(int i=;i<=n;i++)
- {
- printf("%d\n",ans[i].size());
- for(int k=;k<ans[i].size();k++) printf("%d %d\n",i,ans[i][k]);
- }
- }
D - Array Without Local Maximums - [dp]
题意:给定一个长度为 $n(n \le 1e5)$ 的数组 $a[1:n]$,$a[i]$ 的值域为 $1$ 到 $200$,且每个数的旁边必须有一个不小于它的数。而有些数字被擦掉了,现在问共有多少种可行的填充方案。
题解:
看到这题第一感觉就dfs暴力搜索,然而时间复杂度显然不行,因此考虑dp。
考虑 $dp[i][x][0,1,2]$ 的表示的状态为已经确定了第 $i$ 个数字为 $x$,而 $0,1,2$ 分别表示第 $i-1$ 个数 $w$ 是小于、等于或大于 $x$。其存储的值是其状态下的方案数。
那么就有状态转移方程(当然这是建立在第 $i+1$ 位可以填 $y$ 的前提下的):
$\begin{array}{l} dp[i + 1][y][0] = \sum\limits_{x = 1}^{y - 1} {dp[i][x][0,1,2]} \\ dp[i + 1][y][1] = dp[i][y][0,1,2] \\ dp[i + 1][y][2] = \sum\limits_{x = y + 1}^{200} {dp[i][x][1,2]} \\ \end{array}$
边界条件,考虑到第 $1$ 个数左边是空的,相当于左边是一个更小的数,因此有(依然是建立在第一位能填入 $x$ 的前提下):
$\begin{array}{l} dp[1][x][0] = 1 \\ dp[1][x][1] = 0 \\ dp[1][x][2] = 0 \\ \end{array}$
AC代码:
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const ll mod=;
- const int maxn=1e5+;
- int n,a[maxn];
- ll sum,dp[maxn][][];
- int main()
- {
- cin>>n;
- for(int i=;i<=n;i++) scanf("%d",&a[i]);
- for(int x=;x<=;x++)
- {
- if(a[]!=- && a[]!=x) dp[][x][]=dp[][x][]=dp[][x][]=;
- else dp[][x][]=, dp[][x][]=dp[][x][]=;
- }
- for(int i=;i<=n;i++)
- {
- sum=;
- for(int y=;y<=;y++)
- {
- if(a[i]!=- && a[i]!=y) dp[i][y][]=;
- else dp[i][y][]=sum;
- sum+=(dp[i-][y][]+dp[i-][y][]+dp[i-][y][])%mod;
- sum%=mod;
- }
- for(int y=;y<=;y++)
- {
- if(a[i]!=- && a[i]!=y) dp[i][y][]=;
- else dp[i][y][]=(dp[i-][y][]+dp[i-][y][]+dp[i-][y][])%mod;
- }
- sum=;
- for(int y=;y>=;y--)
- {
- if(a[i]!=- && a[i]!=y) dp[i][y][]=;
- else dp[i][y][]=sum;
- sum+=(dp[i-][y][]+dp[i-][y][])%mod;
- sum%=mod;
- }
- }
- ll ans=;
- for(int x=;x<=;x++) ans+=(dp[n][x][]+dp[n][x][])%mod, ans%=mod;
- cout<<ans<<endl;
- }
E - Multihedgehog - [BFS]
题意:
一个连通无向图,若仅有一个节点度数不小于 $3$,其他所有节点度数均为 $1$,则称为“刺猬”。现在定义“$k$-刺猬”,为:
“$1$-刺猬”即普通“刺猬”;
对于“$k$-刺猬”,其由“$k-1$-刺猬”变化而来,将“$k-1$-刺猬”的所有度数为 $1$ 的顶点换成一个“$1$-刺猬”的中心,即构成“$k$-刺猬”。
现在给你一张图和一个 $k$,让你判断这张图是否为“$k$-刺猬”。
题解:
首先,当 $k=11$ 时,节点数最少也需要 ${\sum_{i=0}^{11}{3^i}} = 265720$ 个顶点,显然已经不够了,所以对于 $k \ge 11$ 的情况可以直接判断不行。
接下来,可以考虑以所有度数为零的节点为起始,将它们的深度定义为 $0$。然后自底向上地进行BFS(或者说BFS的一种变形?),同时不断地删除叶子结点。
对于每个节点,都需要判断它的深度和度数是否可行,还要判断其父亲节点是否只有一个。
对于最后一个没有父亲节点的根节点,判断他的深度是否等于 $k$。
AC代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn=1e5+;
- const int maxm=2e5+;
- int n,k;
- int degree[maxn];
- struct Edge{
- int u,v;
- int next;
- };
- Edge E[maxm];
- int head[maxn],ne;
- void init()
- {
- ne=;
- memset(head,,sizeof(head));
- }
- void addedge(int u,int v)
- {
- ++ne;
- E[ne].u=u, E[ne].v=v;
- E[ne].next=head[u];
- head[u]=ne;
- }
- int dist[maxn];
- bool del[maxn],vis[maxn];
- bool bfs()
- {
- queue<int> Q;
- for(int i=;i<=n;i++)
- {
- if(degree[i]==) Q.push(i), vis[i]=, dist[i]=;
- else vis[i]=;
- }
- memset(del,,sizeof(del));
- while(!Q.empty())
- {
- int u=Q.front(); Q.pop();
- del[u]=; //将节点删除
- int cnt=; //记录父亲节点个数
- for(int i=head[u];i;i=E[i].next)
- {
- int v=E[i].v;
- if(del[v]) continue;
- else cnt++;
- if(cnt>) return false; //父亲节点应当只有一个
- if(!vis[v])
- {
- vis[v]=;
- dist[v]=dist[u]+;
- Q.push(v);
- }
- else
- {
- if(dist[v]!=dist[u]+) return false;
- }
- }
- if(cnt==) { //当前节点是根节点
- if(degree[u]<) return false;
- if(dist[u]!=k) return false;
- }
- else if(degree[u]>) { //当前节点不是根节点也不是叶子结点
- if(degree[u]<=) return false;
- }
- }
- return true;
- }
- int main()
- {
- cin>>n>>k;
- init();
- memset(degree,,sizeof(degree));
- for(int i=,u,v;i<n;i++)
- {
- scanf("%d%d",&u,&v);
- addedge(u,v);
- addedge(v,u);
- degree[u]++;
- degree[v]++;
- }
- if(n< || k>=) printf("No\n");
- else printf("%s\n",bfs()?"Yes":"No");
- }
Codeforces 1068 - A/B/C/D/E - (Done)的更多相关文章
- Codeforces Round #518 (Div. 2) [Thanks, Mail.Ru!]
Codeforces Round #518 (Div. 2) [Thanks, Mail.Ru!] https://codeforces.com/contest/1068 A #include< ...
- codeforces#518 Div2 ABCDE
A---Birthday http://codeforces.com/contest/1068/problem/A 题意: 有n种硬币,m个人.m个人要给Ivan送硬币,每个人送的硬币都要互不相同但数 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
随机推荐
- Tomcat 部署多个项目出现错误
有时,我们会遇到部署同样项目可是不同版本号来回切换的问题.可是有时就是莫名奇异的会起不来. 也没太多时间去解决这些问题,所以就又一次把纯净版的Tomcat部署进去就能够了. 我想非常有可能就是Tomc ...
- 【PHP】解析PHP中的数组
目录结构: contents structure [-] 创建数组 删除数组 栈结构 常用的数组处理函数 在这篇文章中,笔者将会介绍PHP中数组的使用,以及一些注意事项.之前笔者已经说过PHP是一门弱 ...
- java maven通过SMTP发送QQ邮件的完全步骤
1.首先打开QQ邮箱的SMTP服务,因为QQ邮箱对于一般的用户都是默认关闭SMTP服务的. 找到SMTP服务的选项,可以看到此处默认是关闭的,点击开启,然后腾讯会进行一些身份验证,身份验证通过以后,腾 ...
- hive SQL 静态分区和 动态分区
Hive 分区介绍: hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区(static partition) hive中创建分区表没 ...
- Nodejs 使用 es module (import/export)
- 转-编写CGI小结
由于Carl要用到我的程序,我们便合作工作.但是他写的程序是Python的,我写的程序是Java的,必须得找一种方式进行通信.尽管有Jython这些东西,但是Carl认为还是CGI最简便.于是,前阵子 ...
- .NET内存泄漏(之 静态事件)
一.事件引起的内存泄露 1.不手动注销事件也不发生内存泄露的情况 我们经常会写EventHandler += AFunction; 如果没有手动注销这个Event handler类似:EventHan ...
- go module下golang.org如何处理被墙
一.系统提示 go: golang.org/x/sys@v0.0.0-20180905080454-ebe1bf3edb33: unrecognized import path "golan ...
- WebStorm Chinese Language Pack(中文语言包
https://github.com/ewen0930/WebStorm-Chinese http://ewen0930.github.io/2016/04/webstorm-chinese-lang ...
- gsoap入门:C/C++代码生成及编译--包含soapcpp2 -qname添加命名空间后报错的解决方法--可用
gsoap是什么 先来一段百度百科,说说gsoap是什么: gSOAP一种跨平台的开源的C/C++软件开发工具包.生成C/C++的RPC代码,XML数据绑定,对SOAP Web服务和其他应用形成高效的 ...