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简要题解的更多相关文章

  1. Codeforces Round #609 (Div. 2)前五题题解

    Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...

  2. Codeforces Round #573 (Div. 1) 差F

    Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...

  3. Codeforces Round #541 (Div. 2) (A~F)

    目录 Codeforces 1131 A.Sea Battle B.Draw! C.Birthday D.Gourmet choice(拓扑排序) E.String Multiplication(思路 ...

  4. Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)

    F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...

  5. Codeforces Round #615 (Div. 3)

    A. Collecting Coins 题目链接:https://codeforces.com/contest/1294/problem/A 题意: 你有三个姐妹她们分别有 a , b , c枚硬币, ...

  6. Codeforces Round #600 (Div. 2)E F

    题:https://codeforces.com/contest/1253/problem/E 题意:给定n个信号源,俩个参数x和s,x代表这个信号源的位置,s代表这个信号源的波及长度,即这个信号源可 ...

  7. Codeforces Round #346 (Div. 2) E F

    因为很久没有个人认真做题了 昨天晚上开了场虚拟cf来锻炼个人手速 选的是第一次做cf的场 那时候7出3还被hack...之后也没补题 这次做的时候顺便回忆了一下以前比赛的时候是怎么想的 发现经验还是很 ...

  8. Codeforces Round #322 (Div. 2) E F

    E. Kojiro and Furrari 题意说的是 在一条直线上 有n个加油站, 每加一单位体积的汽油 可以走1km 然后每个加油站只有一种类型的汽油,汽油的种类有3种 求从起点出发到达终点要求使 ...

  9. Codeforces Round #506 (Div. 3) 1029 F. Multicolored Markers

    CF-1029F 题意: a,b个小正方形构造一个矩形,大小为(a+b),并且要求其中要么a个小正方形是矩形,要么b个小正方形是矩形. 思路: 之前在想要分a,b是否为奇数讨论,后来发现根本不需要.只 ...

随机推荐

  1. BZOJ #2506. calc [根号分治,莫队,二分]

    \(p\) 是个正常范围, \(\sqrt p <= 100\) 比较小,预处理出来 \(a_i % p == k\) 的位置,然后丢进去,最后询问的 \(p\) 如果大于 \(100\) 就莫 ...

  2. ArcMap 新建空白图层,并添加元素

    想要添加新的图层,不能从File 里找,那里都是添加数据,貌似ArcGIS的定位是对数据的处理. 比如导入其他格式文件,或者导入对应的数据文件.excel csv cad 等,在此基础上进行分析,而不 ...

  3. 树莓派pip安装opencv报错,Could not find a version that satisfies the requirement cv2 (from versions: )No matching distribution found for cv2

    前言 我在使用pip install opencv-python 时报错 Could not find a version that satisfies the requirement opencv ...

  4. JavaScript-跨浏览器事件处理程序(EventUtil)

    事件操作对象: var EventUtil= { //添加事件 addHandler: function (element, type, handler) { if (element.addEvent ...

  5. gulp常用插件之gulp-htmlmin使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-htmlmin这是一款HTML文件压缩插件. 更多使用文档请点击访问gulp-htmlmin工具官网. 安装 一键安装不多解释 npm ...

  6. 金蝶云星空BOS开发视频分享

    https://vip.kingdee.com/school/implementCourseOnline

  7. Selenium3+python自动化014-自动化测试框架的作用

    1.能够有效组织和管理测试脚本 2.进行数据驱动或者关键字驱动的测试 3.将基础的测试代码进行封装,降低测试脚本编写的复杂性和重复性 4.提高测试脚本维护和修改的效率 5.自动执行测试脚本,并自动发布 ...

  8. 从零开始的JAVA(1).输入

    理一遍JAVA的输入和输出,跟C语言还是有点不用的,虽然以前学过一点.不过好像忘的一干二净了哈哈.从头来一遍把,这次跟着翁恺老师GOGO 1.输出语句:System.out.println();--快 ...

  9. Python3标准库:enum枚举

    1. enum枚举 枚举是一组符号名称(枚举成员)的集合,枚举成员应该是唯一的.不可变的.在枚举中,可以对成员进行恒等比较,并且枚举本身是可迭代的. 1.1 创建枚举 可以使用class语法派生Enu ...

  10. canvas特效-文字粒子

    具体的效果 https://www.ui.cn/detail/393461.html 实现类似的动效 要求: 1.文字内容可以自定义 2.粒子的运动轨迹 是曲线,返回是按照 原运动轨迹 3.粒子 堆叠 ...