contest链接:https://codeforces.com/contest/1283

A. Minutes Before the New Year

题意:给一个当前时间,输出离第二天差多少分钟

思路:略

AC代码:

 #include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int mod = 1e9+;
const int maxn = 1e5+;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
int h,m;cin>>h>>m;
h = - h,m = - m;
cout<<(h)*+m<<endl;
}
return ;
}

B. Candies Division

题意:  给每个人分糖果,得到糖果数最多的人的糖果数与得到糖果数最少的人的数量之差不能大于一。并且得到糖果数量最多的人不得多于人数的一半。

思路:略

AC代码:

 #include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int mod = 1e9+;
const int maxn = 1e5+;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
ll n,k;cin>>n>>k;
ll t = n/k;
ll d = n - t*k;
ll t1 = min(k/,d);
cout<<t*k+t1<<endl;
}
return ;
}

C. Friends and Gifts

题意:每个人都要给其他一个人一个礼物,并且每个人都要收到一个礼物。请你设计一种合法的赠送礼物的方法,使得每个人都赠送非自己的人一个礼物,并且从其他人那里收到一个礼物。

题解:最终合法的方法是若干个有向环,输入的时候存每个人的出度和入度,出度表示赠送礼物,入度表示接收礼物,最终保证每个人的出入度都是1。再输入统计完之后首先排除掉构成环的所有人,因为他们已经满足题意要求。再者是既没有得到礼物,又没有赠送礼物的人,即出入度都是0,然后让他们互相连接起来,记作集合R,最终让入度为1出度为0的人连接集合R,集合R中进行操作过后,留下一个人出度为0,再让这个人连接最后一个出度为1,入度为0的人,总体构成一个环即可。

AC代码:

 #include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int mod = 1e9+;
const int maxn = 2e5+;
typedef long long ll;
struct node{
int in;
int out;
}g[maxn]; int main(){
int n;
cin>>n;
for(int i = ;i<=n;i++){
g[i].in = ;
}
for(int i = ;i<=n;i++) {
int t;cin>>t;
g[i].out = t;
g[t].in = i;
}
int start = -,end = -;
vector<int> v ,vIn,vOut;
for(int i = ;i<=n;i++){
if(g[i].in != && g[i].out == ) vOut.push_back(i);
if(g[i].in == && g[i].out != ) vIn.push_back(i);
if(g[i].in == && g[i].out == ) v.push_back(i);
}
if(v.size() > ){
start = v[],end = v[v.size() -];
int first = v[];
for(int i = ;i<v.size() -;i++){
g[start].out = v[i];
start = v[i];
}
g[start].out = end;
g[end].out = first;
}
if(v.size() == ){
int t = vOut[vOut.size() -];
g[t].out = v[];
g[v[]].in = t;
vOut.pop_back() ;
vOut.push_back(v[]);
}
for(int i = ;i<vOut.size() ;i++){
int cur = vOut[i],next = vIn[i];
g[cur].out = next; }
for(int i = ;i<=n;i++){
cout<<g[i].out <<" ";
}
return ;
}

D. Christmas Trees

题意:给定n个不同的整数点,让你找m个不同的整数点,使得这m个点到到这n个点最小距离之和最小。

思路:贪心一下,首先每个点的x+1和x-1两个坐标到这个点的距离是最短的,之后是x+2,x-2,再之后是x+3,x-3,那么可以想到bfs,首先把n个点存入队列中,找与他们距离为1的点,之后再bfs距离为2的点,如此这个过程直到找到m个点

AC代码:

 #include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
const int mod = 1e9+;
const int maxn = 2e5+;
typedef long long ll;
queue<pair<int,int> > q;
map<int,bool> vis;//用map记录是否访问过
vector<int> v;
int main(){
int n,m;cin>>n>>m;
while(n--){
int t;cin>>t;
vis[t] = ;
q.push({,t+}),q.push({,t-}); //首先存距离为1的点
}
ll ans = ;
while( m> && !q.empty() ){
pair<int,int> cur = q.front() ;
q.pop() ;
if(vis[cur.second]!=){//如果没有遍历过
m--;
v.push_back(cur.second );
ans+=cur.first;
vis[cur.second] = ;
if(vis[cur.second+] != ) q.push({cur.first+,cur.second+});//距离+1,入队列
if(vis[cur.second-] != )q.push({cur.first+,cur.second-}); //同上
}
}
cout<<ans<<endl;
for(int i = ;i<v.size() ;i++){
cout<<v[i]<<" ";
}
return ;
}

E. New Year Parties

题意: 有n个人住在一些房子里,有的人住在同一个房子里。每个人可以选择搬去他的房子左边那个房子或者右边那个房子,亦或是不搬,搬只能向左或向右移动一次。问这些人最少住几个房子和最多住几个房子。

题解:贪心。最小值就是三人聚合起来,聚合在一个房子。最大值就是贪心地尽可能地向空房子移动

AC代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 2e5+ ;
int x[maxn];
int s[maxn];
int main(){
int n;cin>>n;
for(int i = ;i<n;i++){
int t;cin>>t;
x[t] ++;
s[t] ++;
}
int mx = ,mi = ;
for(int i = ;i<=n+;i++){//求最大值
if(x[i] == ) continue;//当前为0,没人住就跳过
if(x[i-] == ){//前一个房子为空,就移动过一个人,占一个房子
x[i]--;
x[i-]++;
}
if(x[i]>){//往前一个房子移动过一个人后,如果还有多余的人能再移动,就尽可能再往后面的房子移动
x[i+]++;
x[i]--;
}
}
for(int i = ;i<=n+;i++){
if(x[i]!=) mx++;
}
vector<int> v;
int f = ,cur = ;
for(int i = ;i<=n;i++){
if(s[i] != ){//如果当前房子有人,那么房子+1和-1地方的人都聚合过来,每三个人跳转一次
mi++;
i+=;//直接跳转
}
}
cout<<mi<<" "<<mx;
return ;
}

F. DIY Garland

题意:一根电线连接着两个点,这两个点分别代表着两个灯,灯有自己的编号i,其亮度是2 ^ i,每根电线的两个灯分别为主灯和副灯,电源从主灯来,电流向副灯。最开始有一个源点灯,所有的电源从此处流入,对于每根电线,定义其重要性为 :切断这根电线后不能通电的所有灯的亮度之和。首先题目按电线的重要性给出n-1条电线的主灯编号,让你从大到小输出每条电线所连接的两个灯的序号(无前后差别)

题解:首先,题目的所描述的结构是一棵树,因为题目是按电线重要性给出的节点主灯,那么第一个节点必定是源点,因为重要性最大。其次因为树的叶子节点度必为1,而且叶子节点必定不是主灯,那么我们可以在输入之后统计叶子节点,同时统计一下输入节点的度。叶子节点的编号用优先队列存储,因为亮度最小最先和重要性低的电线匹配。因为输入的时候电线是按重要性从大到小输入的,那么我们就可以把优先队列中的节点一个一个地与其父亲节点(主灯)匹配,匹配过后,让当前这个主灯的度-1,如果这个此时度变为1,那么加入到优先队列之中,因为他现在成了“叶子节点”,如此过程直到把n-1条边都找到,break即可

AC代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 2e5+;
int ind[maxn];
vector<pair<int,int> > ans;
int main(){
int n;
cin>>n;
priority_queue<int, vector<int>,greater<int> > q;
vector<int> mainLamp;
int gird = -;
for(int i = ;i<n-;i++){
int lamp;
cin>>lamp;
if(gird == -) gird = lamp;//记录源点
ind[lamp]++;//记录度
mainLamp.push_back(lamp);
}
for(int i = ;i<=n;i++){
if(ind[i] == ){//寻找未出现的叶子节点
q.push(i);
}
}
while(!q.empty() ){
int cur = q.top();
q.pop();
int curMainLamp = mainLamp[mainLamp.size()-];
mainLamp.pop_back();//匹配一个主灯,就弹出一个
ans.push_back({curMainLamp,cur});//加入一条边
if(ans.size() == n - ) break;
ind[curMainLamp]--;
if(ind[curMainLamp] == ){
q.push(curMainLamp);//如果度为0,那么变成了叶子节点,加入队列中
}
}
cout<<gird<<endl;
for(int i = ans.size() -;i>= ;i--){
cout<<ans[i].first<<" "<<ans[i].second<<endl;
}
return ;
}

Codeforces Round #611 (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 #611 (Div. 3)

    原题面:https://codeforces.com/contest/1283 A.Minutes Before the New Year 题目大意:给定时间,问距离零点零分还有多久? 分析:注意一下 ...

  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. if、counf、countif、countifs、sumif、sumifs

    评分等级:=IF(C3>=90,"优秀",IF(C3>=80,"良好",IF(C3>=60,"及格","不及格& ...

  2. 覆盖的面积 HDU - 1255 线段树+扫描线+离散化 求特定交叉面积

    #include<cstdio> #include<map> #include<algorithm> using namespace std; ; struct N ...

  3. UniGUI之UniLabel(31)

    1]改变文本Caption 2]改变颜色字体Font 3]点击访问网址,OnClick事件 1]改变文本Caption unilabel1.Caption:='unilabel1文本'; 2]改变颜色 ...

  4. Centos中Python升级为3.X时yum出现except OSError, e: ^ SyntaxError: invalid syntax问题 No module named 'pip._internal.main

    CentOS 7升级Python到3.7.2后,需要在/usr/bin/python创建了一个指向Python 3的软连接,然后将/usr/bin/yum的顶部的: !/usr/bin/python ...

  5. JavaDay10(上)

    Java learning_Day10(上) 本人学习视频用的是马士兵的,也在这里献上 <链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA&g ...

  6. PIE-SDK For C++ Geometry的坐标转换

    1. 基于SpatialReference对象的坐标转换 1.1 示例简介 Geometry类是所有几何形体对象的父类,它是一个抽象类,IGeometry接口定义了所有的几何对象都有的方法和属性. 下 ...

  7. Building a Space Station POJ - 2031 三维最小生成树,其实就是板子题

    #include<iostream> #include<cmath> #include<algorithm> #include<cstdio> usin ...

  8. C语言 三目运算

    C语言 三目运算 功能:为真后可根据条件选择成立两个不同的表达式 如果表达式1值为真选择表达式2 如果表达式1值为假选择表达式3 案例 #define _CRT_SECURE_NO_WARNINGS ...

  9. vue自学入门-4(vue slot)

    vue自学入门-1(Windows下搭建vue环境) vue自学入门-2(vue创建项目) vue自学入门-3(vue第一个例子) vue自学入门-4(vue slot) vue自学入门-5(vuex ...

  10. .Net Core的总结

    一.什么是.NET Core .NET Core是一个开源通用的开发框架,支持跨平台,即支持在Window,macOS,Linux等系统上的开发和部署,并且可以在硬件设备,云服务,和嵌入式/物联网方案 ...