A. Collecting Coins

题目链接:https://codeforces.com/contest/1294/problem/A

题意:

你有三个姐妹她们分别有 a , b , c枚硬币,你有n枚,你可以把硬币随意分给她们(必须分完),使她们的硬币数A = B = C

分析:

题目的条件有两点:

①A = B = C

②在满足①的前提下必须把硬币分完

我们首先要满足第一点。因为硬币个数有限,我们要尽可能用最少的硬币使 A = B = C,所以只要让a,b,c中小的两个等于最大的即可

那么我们剩下的硬币数就为 $n-\left( \max -a\right) -\left( \max -b\right) -\left( \max -c\right)$ 判断剩余数是否大于0即可(是否足够分配)

对于第二个条件,只要判断我们剩下的硬币是否是三的倍数即可(只有为三倍数才可以等量均分保持A = B = C)

#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t --)
{
int a , b , c , n;
cin >> a >> b >> c >> n;
int MAX = max(a , max(b , c));
n -= (MAX - a) + (MAX - b) + (MAX - c);
if(n < || n % != )
cout << "NO" << '\n';
else
cout << "YES" << '\n';
}
return ;
}

B. Collecting Packages

题目链接:https://codeforces.com/contest/1294/problem/B

题意:

有n个盒子需要你捡,第i个盒子的坐标为 (Xi , Yi)。你从(0,0)出发,每次只能选择向上或者向右移动,问能否将n个盒子都捡完,若可以捡完,则输出字典序最小的一条路线

分析:

我们将n个盒子的坐标先按照x值再按照y值排序。因为是按照 X 升序排序的,所以当 Yi  > Yi + 1 时,很显然此时第i个盒子和第i+1个盒子有一个不能走到

而 Yi <= Yi+1 时,为了保证字典序最小,我们先加上(Xi+1 - Xi)个L, 再加上(Yi+1 - Yi)个纵坐标即可

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
const int N = 2e5 + ;
pair<int , int> ha[N];
int main()
{
int t;
cin >> t;
while(t --)
{
int n , flag = ; string ans = "";
cin >> n;
for(int i = ; i <= n ; i ++)
cin >> ha[i].fi >> ha[i].se;
ha[].fi = , ha[].se = ;
sort(ha , ha + + n);
for(int i = ; i < n ; i ++)
{
if(ha[i].se > ha[i + ].se)
{
flag = ; break;
}
int dis1 = ha[i + ].fi - ha[i].fi;
int dis2 = ha[i + ].se - ha[i].se;
while(dis1)
ans += "R" , dis1 --;
while(dis2)
ans += 'U' , dis2 --;
}
if(flag)
cout << "YES" << '\n' << ans << '\n';
else
cout << "NO" << '\n';
}
return ;
}

C. Product of Three Numbers

题目链接:https://codeforces.com/contest/1294/problem/C

题意:

给你一个 n ,要求三个整数 a ,b ,c 使得 a * b * c = n 并且 a、b、c >= 2

分析:

先枚举 n 的因子,再枚举因子的因子即可

#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t --)
{
int n;
cin >> n;
int ans1 , ans2 , ans3;
int flag = ;
for(int i = ; i * i <= n ; i ++)
{
if(n % i == )
{
for(int j = ; j * j < i ; j ++)
{
if(i % j) continue;
ans1 = n / i , ans2 = j , ans3 = i / j;
flag = ;
break;
}
int now = n / i;
for(int j = ; j * j < now ; j ++)
{
if(now % j || now / j == i || j == i) continue;
ans1 = i , ans2 = j , ans3 = now / j;
flag = ;
break;
}
}
}
if(!flag) cout << "NO" << '\n';
else cout << "YES" << '\n' << ans1 << " " << ans2 << " " << ans3 << '\n';
}
return ;
}

D. MEX maximizing

题目链接:https://codeforces.com/contest/1294/problem/D

题意:

给你 q 个询问和 一个 x , 每次询问输入一个数 n ,你可以把它减任意次 x 或 加任意次 x,然后添入数组,问每次询问结束时数组里最小的没出现的非负整数是多少

分析:

我们可以想象有若干个长度为 x 的区间[0 , x - 1] ,那么每次询问的数 n 只会出现在某个区间的 n % x位置上。为了满足题目要求,我们要尽可能让它填在比较靠前的区间里

cnt [i] 表示此次询问时,若干个区间一共有cnt[i] 个 i 可以填到若干个区间中的 i 位置上(为了满足题目要求,我们从第一个区间的第i个位置开始填,然后再填第二个区间第i个位置)

然后我们从第一个区间开始检查。若到当前位置时cnt[i] != 0,则我们让cnt[i] --(表示我们拿一个i填在这个位置上),同时往下一个位置跳,直到遇到一个没有数可填的位置——cnt[pos] = 0

#include<bits/stdc++.h>
using namespace std;
map<int , int>cnt;
int main()
{
int q , x , ans = ;
cin >> q >> x;
while(q --)
{
int n;
cin >> n;
cnt[n % x] ++;
while(cnt[ans % x])
cnt[ans % x] -- , ans ++;
cout << ans << '\n';
}
return ;
}

E. Obtain a Permutation

题目链接:https://codeforces.com/contest/1294/problem/E

题意:

给你一个 n * m 的矩阵,你执行两种操作:

① 把矩阵中任意一个元素改为任意一个数

② 把矩阵中任意一列整体往上挪一个单元格,如下图矩阵我们对第一列向上挪了一个单元格

现要求用最少的操作次数使矩阵内每一个元素 a[i][j] = (i - 1) * m + j

分析:

因为题目只能对一列或者一个元素进行操作,所以我们逐列进行维护。

对第i行第j列的元素a[i][j] 我们假设它将成为这列的起点(第一个元素) 那么最坏的操作次数cost[i]为 i + N (把它移动到第1位需要i次 如果元素全都很奇葩需要更改N次)

对于每一列的操作,我们先初始化cost[i] = i + N , 然后如果a[i][j]可以作为第h行的答案的答案,那么cost[h] --(把a[h][j]行设为起点的最坏操作- 1)

最后遍历cost[1] ~ cost[n] 挑选最小的cost加到ans里即可

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + ;
int main()
{
int n , m ;
cin >> n >> m;
vector<vector<int>>a(n , vector<int>(m));
for(int i = ; i < n ; i ++) for(int j = ; j < m ; j ++)
{
cin >> a[i][j];
a[i][j] --;
}
int ans = ;
for(int j = ; j < m ; j ++)
{
vector<int>cost(n);
for(int i = ; i < n ; i ++) cost[i] = i + n;
for(int i = ; i < n ; i ++)
{
if(a[i][j] % m == j && a[i][j] < n * m)
{
int h = i - a[i][j] / m;
if(h < ) h += n;
cost[h] --;
}
}
ans += *min_element(cost.begin() , cost.end());
}
cout << ans << '\n';
return ;
}

F. Three Paths on a Tree

题目链接:https://codeforces.com/contest/1294/problem/F

题意:

给你一棵树,要求你找出任意三点 A,B,C,使得 A~B,B~C,A~C 之间的边最多(边并集最大)

分析:

比赛最后几分钟做出来了,然而一时马虎,提交到E题上去了。然后评测机也不给力,等赛后几分钟我才知道交错题了。再放到F题上提交,一发就过了。。。

可证明一组最优解中一定有两个点是直径的两端点,那么题目就转换成求树直径端点及与两端点边并集最大的点,于是就很简单了

我们先一次bfs求出树直径DIS即其一端点A,再对端点A进行bfs求出另一端点B及每个点到端点A的距离dis1[i],最后再bfs端点B求出每个点到B的距离dis2[i]

最后遍历每个点,取边并集最大的即可(边并集= $\dfrac {dis1\left[ i\right] +dis2\left[ i\right] -DIS}{2}+DIS$)

现在给出证明:

假设某个答案取连接点x。x最远的树到达的点是s,根据树的直径算法,s是树的某个直径a的端点。假设x的最远和第二远的点组成的链是b,b就会和a有一段公共部分。我们取a和b相交部分距离s最远的那个点y。那么取这个链上点y的答案一定比x更优

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + ;
struct Edge{
int nex , to , w;
}edge[N];
int one , two , DIS;
int head[N] , vis[N] , d[N];
int tot = ;
void add(int u , int v , int w)
{
edge[tot].w = w;
edge[tot].to = v;
edge[tot].nex = head[u];
head[u] = tot ++;
}
int bfs(int st)
{
memset(d , , sizeof(d));
memset(vis , , sizeof(vis));
queue<int>que;
que.push(st);
vis[st] = ;
int now;
while(!que.empty())
{
now = que.front() , que.pop();
for(int i = head[now] ; ~i ; i = edge[i].nex)
{
int TO = edge[i].to;
if(vis[TO]) continue;
d[TO] = d[now] + edge[i].w;
vis[TO] = ;
que.push(TO);
if(DIS < d[TO]) DIS = d[TO];
}
}
return now;
}
int dis1[N] , dis2[N];
int main()
{
ios::sync_with_stdio(false);
memset(head , - , sizeof(head));
int n ;
cin >> n;
for(int i = ; i < n ; i ++)
{
int x , y;
cin >> x >> y;
add(x , y , );
add(y , x , );
}
DIS = ;
int one , two , three;
one = bfs();
two = bfs(one);
for(int i = ; i <= n ; i ++)
dis1[i] = d[i];
bfs(two);
for(int i = ; i <= n ; i ++)
dis2[i] = d[i];
int ans = ;
for(int i = ; i <= n ; i ++)
{
if((dis1[i] + dis2[i] - DIS) / + DIS > ans && i != one && i != two)
ans = (dis1[i] + dis2[i] - DIS) / + DIS , three = i;
}
cout << ans << '\n';
cout << one << " " << two << " " << three << '\n';
return ;
}

  为了更好的供人观看,每一份代码我都是重新手写的,请多支持

Codeforces Round #615 (Div. 3)的更多相关文章

  1. 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三个数的差值 ...

  2. Codeforces Round #615 (Div. 3) 题解

    A - Collecting Coins 题意: 给你四个数a,b,c,d,n.问你是否能将n拆成三个数A,B,C,使得A+a=B+b=C+c. 思路: 先计算三个数的差值的绝对值abs,如果abs大 ...

  3. Codeforces Round #615 (Div. 3) 补题记录

    第一次搞CF,结果惨不忍睹...还是太菜了 A:要用到全部的钱,所以总数必须是3的倍数,而且初始状态下任意一人的钱数不能超过总数除以3,否则没法分了 (也就这个签到算是在我能力范围之内了....) # ...

  4. Codeforces Round#615 Div.3 解题报告

    前置扯淡 真是神了,我半个小时切前三题(虽然还是很菜) 然后就开始看\(D\),不会: 接着看\(E\),\(dp\)看了半天,交了三次还不行 然后看\(F\):一眼\(LCA\)瞎搞,然后\(15m ...

  5. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  6. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  7. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  8. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  9. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

随机推荐

  1. 高并发WEB服务的演变

    一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加 Web系统的机器和升级硬件配置.虽然 ...

  2. C# Abort() 多线程运行逻辑

    / Thread t ; Thread t2: t.Abort()执行后,会阻止主线程继续运行,但是不会影响t2线程的执行. static void Main(string[] args) { Con ...

  3. Vscode 开发插件

    vs常用公共插件 Auto Close Tag 自动闭合标签 Auto Rename Tag 自动重命名标签 AutoFileName 自动联想文件名 Autoprefixer 自动兼容前缀 Auto ...

  4. linux之旅首页

    为什么有此系列文章 目录 为什么有此系列文章 一直使用windows,决定使用linux作为操作系统. 使用此系列文章来记录我使用linux过程中遇到的问题,和应对方式 目录 安装linux

  5. CP防火墙备份与还原

    Step1:进入专家模式 ====================================================== 如果没有设置专家模式的密码,执行下面命令进行设置: BJ-OFF ...

  6. 分析CPU使用率不断增加的原因

    工程中发现引起的问题: 结合别的朋友的意见,我的优化思路是: 1.排查是否内存泄漏 经过反复查询代码,未发现有内存泄漏(可以自己百度搜索C#内存泄漏的原因).可以通过任务管理器分析是否有内存泄漏,打开 ...

  7. 边框,元素居中,盒子模型,margin,display,overflow,textarea,float,浮动停止条件,清除浮动影响,margin-top的bug,清除默认样式

    边框 solid实线 dotted虚线 dashed点线 盒子在页面中实际的宽高都是5部分组成 宽=borderleft+paddingleft+width+paddingright+borderri ...

  8. Sublime Text 3 配置java程序运行环境

    最近在使用Java时,发现eclipse太耗电了,就想着用sublime text 3,要使用就要先配置,这是这个软件的特性,于是纠缠了一下午,网上流传很多配置运行java的文章,都没找到合适的(主要 ...

  9. 那天晚上和@FeignClient注解的深度交流

    废话篇 那晚,我和@FeignClient注解的深度交流了一次,爽! 主要还是在技术群里看到有同学在问相关问题,比如: contextId是干嘛的?name相同的多个Client会报错? 然后觉得有必 ...

  10. linux入门基础指令大全(汇总)

    一.文件目录指令 1 pwd指令 pwd 显示当前所在的目录 2 ls指令 ls [选项] [目录或文件] 查看文件信息 ls -a 查看所有文件和目录,包括隐藏的 ls -l 以列表的方式显示 ll ...