Codeforces Round #615 (Div. 3) A-F简要题解
contest链接:https://codeforces.com/contest/1294
A.
给出a、b、c三个数,从n中分配给a、b、c,问能否使得a = b = c。计算a,b,c三个数的差值之和,n对其取余,判断是否为0即可。
AC代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<stack>
#include<unordered_map>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,a,b,c;
scanf("%d%d%d%d",&a,&b,&c,&n);
if(a<b) swap(a,b);
if(a<c) swap(a,c);
if(b<c) swap(b,c);
int dif = a - b + a - c;
if((n - dif)% == && (n - dif)>=) printf("YES\n");
else printf("NO\n"); }
return ;
}
B. Collecting Packages
题意:给定一些点的坐标,问从起点开始移动,能否经过所有的点,且每次只能向上向右移动,求出路径。
思路:所有点按横纵坐标排序,扫一遍所有的点,每次先向右再向上走。
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<stack>
#include<unordered_map>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = ;
struct node{
int x,y;
};
bool cmp(node a,node b){
if(a.x == b.x ) return a.y < b.y ;
return a.x < b.x ;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
node g[maxn];
for(int i = ;i<=n;i++) {
scanf("%d%d",&g[i].x,&g[i].y);
}
sort(g+,g++n,cmp);
string ans = "";
int f = ;
int curx = ,cury = ;
for(int i = ;i<=n;i++){
if(i == ){
int lenR = g[i].x - curx;
int lenU = g[i].y - cury;
ans.append(lenR,'R');
ans.append(lenU,'U');
curx = g[i].x ,cury = g[i].y ;
}
else{
if(g[i].x < curx || g[i].y < cury){
cout<<"NO"<<endl;
f = ;
break;
}
int lenR = g[i].x - curx;
int lenU = g[i].y - cury;
ans.append(lenR,'R');
ans.append(lenU,'U');
curx = g[i].x ,cury = g[i].y ;
}
}
if(f == ) continue;
cout<<"YES"<<endl;
cout<<ans<<endl;
}
return ;
}
C. Product of Three Numbers
题意:求不同的三个数a、b、c,使得a*b*c = n
思路:自己的做法有点复杂,用唯一分解定理做,枚举n的质因子,用质因子去组合成a,b,c,最后判断。
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<map>
#include<set>
#include<stack>
#include<unordered_map>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
void solve(){
int n;
cin>>n;
int tn = n;
set<int> s;
int a,b;
int t = ;
for(int i = ;i*i<=n;i++){
while(n%i == ){//枚举质因子
n/=i;
t = t*i;
if(s.count(i) == ){
s.insert(i);
t = ;
}
if(s.count(t) == && t!=){
s.insert(t);
t = ;
}
if(s.size() == ){
set<int>::iterator iter = s.begin();
int x=*iter;
iter++;
x*=*iter;
if(s.count(tn/x) == && tn/x!=) {
s.insert(tn/x);
break;
} }
if(s.size()>=) {
break;
}
}
if(s.size()>=) break;
}
if(s.size()>=){
cout<<"YES"<<endl;
set<int>::iterator iter = s.begin();
while(iter!=s.end()){
cout<<*iter<<" ";
iter++;
}
}
else{
cout<<"NO"<<endl;
}
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
return ;
}
D. MEX maximizing
题意:一个空数组,一个x值,有q次询问,每次询问向数组插入一个值,数组中所有的值可以任意增加n*x倍,减少n*x被,每次询问输出不包含在数组中最小的正整数值。
思路:一道思维题。每次询问时,把插入的值对x取余,设其为y,意为x可以转移成y,每次记录可以转移到y的数字个数,每次需要y时就查询,这样贪心地进行下去即可,时间复杂度O(n)级别。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 4e5+;
int v[maxn];
int q,x;
int main(){
scanf("%d%d",&q,&x);
int mex = ;
while(q--){
int y;scanf("%d",&y);
if((y%x)!=(mex%x)) v[y%x]++;//当前如果不需要 就先记录下来(y%x)的个数
else{
mex++;//否则就消耗掉
while(){
if(v[mex%x]) v[mex%x]--,mex++;//查询目前所需要的,如果有就消耗一次,再令mex++
else break;
}
}
printf("%d\n",mex);
}
return ;
}
E. Obtain a Permutation
题意:一个n×m的矩阵,矩阵元素的总个数不会超过2e5,有两种操作,1.改变矩阵中任意一元素的值 2.令矩阵的一列所有元素向上移动一格。 求矩阵所有元素恢复成最初位置所需要的最少操作次数
思路:操作只与列有关,贪心地去枚举每一列。扫描一列地的元素,开一个cnt数组,首先判断一下这个元素是否属于该列,如果属于该列,那么记录他恢复到原有位置需要向上移动多少次,假设需要i次,那么让cnt[i] ++,这样扫描完一列之后,再去找该列恢复原有序列的最小操作次数,ans = min(ans,i+n-cnt[i] ),i是该列所有元素移动次数,n是该列元素的个数,n-cnt[i]就是通过向上移动i次,不能到原有位置的元素,这样只能用操作1来实现了。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int main(){
scanf("%d%d",&n,&m);
int g[n][m];
for(int i = ;i<n;i++){
for(int j = ;j<m;j++){
scanf("%d",&g[i][j]);
}
}
int ans = ;
for(int i = ;i<m;i++){
vector<int> cnt(n);
for(int j = ;j<n;j++) cnt[j] = ;//初始化cnt数组
for(int j = ;j<n;j++){
if((g[j][i]-)%m == i && g[j][i]<=m*n){//如果该元素属于这一列
int h = (g[j][i]-)/m ;//计算原有的位置
int dif = j - h;//计算需要向上移动的次数
if(dif<) dif+=n;
cnt[dif]++;//记录+1
}
}
int t = inf;
for(int j = ;j<n;j++) t = min(t,j+n-cnt[j]);//找出该列元素回到原有位置需要的最少操作次数
ans+=t;//每一列操作次数都加和
}
printf("%d",ans);
return ;
}
F. Three Paths on a Tree
题意:给出一无权棵树,在树中找到三个结点a,b,c使得a到b到c路径距离最长,如果a到b的路径和a到c的路径有重复,重复的部分不做计算。
思路:首先树中两点之间最远的距离是树的直径,那么可以用bfs求出树的直径,直径两个端点设为a和b,再用bfs求出其他点到a和b的距离,最后枚举c点即可,这样是最优的,最终答案就等于(dis_ab+dis_bc+dis_ac) / 2。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+;
vector<int> G[maxn];
int dis1[maxn],dis2[maxn],dis[maxn],v[maxn];
int n,a,b,c,pos,disab,disac,disbc;
void bfs(int cur){
queue<int> q;
q.push(cur);
memset(v,,sizeof(v));
memset(dis,,sizeof(dis));
v[cur] = ;
int p = cur,temp = ;
while(!q.empty()){
int now = q.front();
q.pop();
for(int i = ;i<G[now].size();i++){
if(v[G[now][i]] == ){
v[G[now][i]] = ;
q.push(G[now][i]);
dis[G[now][i]] = dis[now] + ;//计算距离
if(dis[G[now][i]] > temp) p = G[now][i],temp = dis[G[now][i]];
}
}
}
pos = p;
} int main(){
scanf("%d",&n);
int st;
for(int i = ;i<n-;i++){
int u,v;
scanf("%d%d",&u,&v);
st = u;
G[u].push_back(v),G[v].push_back(u);
}
bfs();//枚举a
a = pos ;
bfs(a);//枚举b
b = pos;
int t = ;//两边bfs求出树的直径
for(int i = ;i<maxn;i++){//求出其他点到a的距离
dis1[i] = dis[i];
if(dis1[i]>t) {
b = i,t = dis1[i],disab = dis1[i];
}
}
bfs(b);
t = ;
for(int i = ;i<maxn;i++){//求出其他点到b的距离
dis2[i] = dis[i];
if(dis1[i]>t) {
t = dis2[i];
}
}
for(int i = ;i<maxn;i++){
if(dis1[i]+dis2[i] > disac + disbc && i!=a && i!=b){//枚举c点
disac = dis1[i],disbc = dis2[i];
c = i;
}
}
printf("%d\n",(disac+disab+disbc)/);
printf("%d %d %d",a,b,c);
return ;
}
Codeforces Round #615 (Div. 3) A-F简要题解的更多相关文章
- Codeforces Round #609 (Div. 2)前五题题解
Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...
- Codeforces Round #573 (Div. 1) 差F
Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...
- Codeforces Round #541 (Div. 2) (A~F)
目录 Codeforces 1131 A.Sea Battle B.Draw! C.Birthday D.Gourmet choice(拓扑排序) E.String Multiplication(思路 ...
- Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)
F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...
- Codeforces Round #615 (Div. 3)
A. Collecting Coins 题目链接:https://codeforces.com/contest/1294/problem/A 题意: 你有三个姐妹她们分别有 a , b , c枚硬币, ...
- Codeforces Round #600 (Div. 2)E F
题:https://codeforces.com/contest/1253/problem/E 题意:给定n个信号源,俩个参数x和s,x代表这个信号源的位置,s代表这个信号源的波及长度,即这个信号源可 ...
- Codeforces Round #346 (Div. 2) E F
因为很久没有个人认真做题了 昨天晚上开了场虚拟cf来锻炼个人手速 选的是第一次做cf的场 那时候7出3还被hack...之后也没补题 这次做的时候顺便回忆了一下以前比赛的时候是怎么想的 发现经验还是很 ...
- Codeforces Round #322 (Div. 2) E F
E. Kojiro and Furrari 题意说的是 在一条直线上 有n个加油站, 每加一单位体积的汽油 可以走1km 然后每个加油站只有一种类型的汽油,汽油的种类有3种 求从起点出发到达终点要求使 ...
- Codeforces Round #506 (Div. 3) 1029 F. Multicolored Markers
CF-1029F 题意: a,b个小正方形构造一个矩形,大小为(a+b),并且要求其中要么a个小正方形是矩形,要么b个小正方形是矩形. 思路: 之前在想要分a,b是否为奇数讨论,后来发现根本不需要.只 ...
随机推荐
- 【编译原理】TEST递归下降演示
MyUtil.java package Util; import Value_Final.RRule; public class MyUtil { /** * 判断字符串是否是关键字 * @param ...
- 腾讯云nginx配置https
给腾讯nginx服务器配置https, 之前申请https配置后直接给node配置了,还没有用nginx. 按照 https://cloud.tencent.com/document/product/ ...
- Uva1660 (点联通度、边联通度问题)
题意: 给定一个n(n<=50)的无向图,问最小删去几个点,可以使得这个图不连通 解法: 1. 基本概念 (1)一个具有 N 个顶点的图,在去掉任意 K-1 个顶点后 (1<=K&l ...
- Codeforces Round #622(Div 2) C1. Skyscrapers (easy version)
题目链接: C1. Skyscrapers (easy version) 题目描述: 有一行数,使得整个序列满足 先递增在递减(或者只递增,或者只递减) ,每个位置上的数可以改变,但是最大不能超过原来 ...
- Java-天平称重
题目: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量.如果只有5个砝码,重量分别是1,3,9,27,81 则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中).本题 ...
- WIN10开启FTP(完整版)
1.控制面板 --> 程序--> 启用或关闭windows功能 2.左下角搜索栏搜索IIS(iis) 3.右键添加FTP站点 4.创建站点名字和目录 5.绑定本机IP地址,SSL勾选无SS ...
- shell awk学习3
需求: 某文件aa的内容如下: a/p1/p2b/pp1c/ppp1/ppp3d/p1/p2/p3e/p1/p2/p3/p4 期望输出结果: a /p1 /p2 b /pp1 c /ppp1 /ppp ...
- Spring Boot源码(三):去除Tomcat
Spring boot中使用的是内置的Tomcat,而不像Spring mvc那样依赖外部tomcat运行项目. spring boot中导入了Tomcat的jar包: 点进一个Spring boot ...
- #4864. [BeiJing 2017 Wc]神秘物质 [FHQ Treap]
这题其实挺简单的,有个东西可能稍微难维护了一点点.. \(merge\ x\ e\) 当前第 \(x\) 个原子和第 \(x+1\) 个原子合并,得到能量为 \(e\) 的新原子: \(insert\ ...
- 【巨杉数据库SequoiaDB】24 Hours , 数据库研发实录
出场人物: 08:10 小H,是巨杉数据库引擎研发的一名工程师.7:20 天还蒙蒙亮,小H就起床了,点亮了心爱的光剑,开始了新的一天. 在08:10时候,他已经洗漱完,锻炼好身体,倒好 ...