Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2)

题目链接https://codeforces.com/contest/1130

A. Be Positive

题意:

给出n个数,看是否正数的个数过半或者负数的个数过半。

题解:
水题,代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = ;
int n;
double a[N];
int main(){
ios::sync_with_stdio(false);cin.tie();
cin>>n;
int cnt1 = ,cnt2=;
for(int i=;i<=n;i++){
cin>>a[i];
if(a[i]>) cnt1++;
else if(a[i]<) cnt2++;
}
if(cnt1>=(n+)/) cout<<;
else if(cnt2>=(n+)/) cout<<-;
else cout<<;
return ;
}

B. Two Cakes

题意:

给出2*n个商店,每个商店有其序号1,2...n,每个序号两个商店共有。现在有两个人想要买东西,但只能按照序号来买,从1买到n。

他们一开始的位置在最左边,问移动的距离总和最小是多少。

题解:

记录一下序号和位置,然后贪心就行了。

具体见代码吧:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+;
int n;
struct Node{
int val,id;
bool operator < (const Node &A)const{
return val<A.val;
}
}a[N];
int main(){
ios::sync_with_stdio(false);cin.tie();
cin>>n;
for(int i=;i<=*n;i++){
cin>>a[i].val;
a[i].id=i;
}
sort(a+,a+*n+);
ll ans = ;
ans+=a[].id+a[].id-;
for(int i=;i<=*n;i+=){
ans+=min(abs(a[i].id-a[i-].id)+abs(a[i+].id-a[i-].id),abs(a[i].id-a[i-].id)+abs(a[i+].id-a[i-].id));
}
cout<<ans;
return ;
}

C. Connect

题意:

给出n*n的矩阵、起点以及终点,每个格子有0或者1,0代表陆地,1代表水。现在有个人想从起点走到终点,但他不能沾水。现在你可以修最多一条管道,连接两块陆地,费用为相应两点间距离的平方。问最终最小的费用为多少。

题解:

由于n最多只有50,所以可以直接采用很暴力的方法:先求出连通块,然后对起点和终点所在的连通块暴力枚举,最后求最小值。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
int n,cnt;
int r1,c1,r2,c2;
char mp[N][N];
int vis[N][N],bel[N][N];
struct Node{
int x,y;
};
int dx[]={-,,,},dy[]={,,-,};
bool ok(int x,int y){
return x>=&&y>=&&x<=n&&y<=n&&mp[x][y]==''&&!vis[x][y];
}
void bfs(int x,int y,int t){
queue <Node> q;
q.push(Node{x,y});
vis[x][y]=;
while(!q.empty()){
Node now=q.front();q.pop();
int x=now.x,y=now.y;
bel[x][y]=t;
for(int i=;i<;i++){
int curx=x+dx[i],cury=y+dy[i];
if(ok(curx,cury)){
vis[curx][cury]=;
q.push(Node{curx,cury});
}
}
}
}
int dis(int x1,int y1,int x2,int y2){
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
int main(){
cin>>n>>r1>>c1>>r2>>c2;
for(int i=;i<=n;i++){
scanf("%s",mp[i]+);
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(mp[i][j]==''&&!vis[i][j]){
bfs(i,j,++cnt);
}
}
}
int block1=bel[r1][c1],block2=bel[r2][c2];
if(block1==block2){
cout<<;
return ;
}
int ans=0x3f3f3f3f;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(mp[i][j]=='') continue ;
if(bel[i][j]==block1){
for(int p=;p<=n;p++){
for(int q=;q<=n;q++){
if(mp[p][q]=='') continue ;
if(bel[p][q]==block2){
ans=min(ans,dis(i,j,p,q));
}
}
}
}
}
}
cout<<ans;
return ;
}

D2. Toy Train

题意:

给出一个环,有一辆火车从某个位置出发,不断绕着环走。然后有m个糖果需要火车运送,每次火车在一个站只能装配一个糖果,但可以同时卸下多个糖果。

最后输出火车从所有位置出发,并且将所有的糖果都配送完的最小时间。

题解:

这题还是挺有意思的,如果考虑中间过程,那么这个题目将会变得很麻烦。

其实最终会发现,如果我们选定了最后一个需要运送的糖果,那么答案就是固定的。因此我们可以直接枚举火车运送最后一颗糖果的时候从哪里出发就行了。

这里最后维护答案的时候要取max,稍微想下就知道了。

代码如下:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = ;
int n,m;
vector <int> g[N];
int main(){
ios::sync_with_stdio(false);cin.tie();
cin>>n>>m;
for(int i=;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
}
for(int i=;i<=n;i++){
int ans = ,tot;
for(int j=;j<=n;j++){
int num = g[j].size();
if(num==) continue ;
tot=INF;
for(auto v:g[j]){
tot=min(tot,(num-)*n+(j-i+n)%n+(v-j+n)%n);
}
ans=max(ans,tot);
}
cout<<ans<<" ";
}
return ;
}

这个题还可以优化一波,就是不挨个从vector里面找,可以事先预处理一下从当前位置出发最短的距离是多少,然后根据这个来算就行了。

E. Wrong Answer

题意:

构造题,这里有一段代码:它只会记录和为非负数的一段数乘以其区间长度的最大值,但我们现在要求的是sum{ai}*(r-l+1),l<=i<=r,很明显这段代码是有错误的。

然后会输入一个k,你构造一组数据,使得正解和这段代码给出的答案相差k。最后输出你给出的数据。

题解:

这也是一个挺有意思的构造题吧,构造方法有很多,我说下我这个吧:

首先找到一个v,满足(k+v)%n==0,然后我们就想让我们构造出来的n个数的和为(k+v)/n,那么正解现在就应该是k+v了。

现在我们就只需要让有毒的代码得到v就行了。现在设出a,b两个数,其中a=v,那么(k+v)/n=a+b,这里我们算出b的值且b为负数就好了,那么最终的a,b就是我们需要构造的数。

具体构造方法为0,0,0,......b,a。这里一共有2000个数,b在前面可以使得有毒的代码得到a(也就是v),同时正确答案是k+v。那么此时就满足条件了。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int k,v,a,b;
int main(){
ios::sync_with_stdio(false);cin.tie();
cin>>k;
int n=;
v=;
while(){
int f1=,f2=;
if((k+v)%n==) f1=;
if(f1&&(k+v)/n-v<) f2=;
if(f1&&f2) break ;
v++;
}
a=v;
b=(k+v)/n-a;
cout<<n<<endl;
for(int i=;i<=n-;i++) cout<<<<" ";
cout<<b<<" "<<a;
return ;
}

Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题解的更多相关文章

  1. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1) C(二分+KMP)

    http://codeforces.com/contest/1129/problem/C #include<bits/stdc++.h> #define fi first #define ...

  2. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) A - D2

    A. Be Positive 链接:http://codeforces.com/contest/1130/problem/A 题意: 给一段序列,这段序列每个数都除一个d(−1e3≤d≤1e3)除完后 ...

  3. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2)

    A. Be Positive 题意:给出一个数组 每个树去除以d(d!=0)使得数组中大于0的数 大于ceil(n/2) 求任意d 思路:数据小 直接暴力就完事了 #include<bits/s ...

  4. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1)C. Morse Code

    题意:给你n个01字符,每次问你前缀的所有本质不同的子串,由摩斯密码组成的方案数和. 题解:离线处理,把字符建sam,通过topo序来dp计算每个节点表示的子串方案数的和.统计答案时,把n个字符挨个匹 ...

  5. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1)

    A - Toy Train 很显然,一个站有多少个糖,那么就要从这个点运多少次.设第i个点有\(a_i\)个糖,那么就要转\(a_i-1\)圈,然后再走一段.很显然最后一段越小越好. 然后枚举起点后, ...

  6. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1) 题解

    A. Toy Train 时间限制:2 seconds 内存限制:256 megabytes 题意 有编号111~n(n≤5000)n(n\le 5000)n(n≤5000)的车站顺时针呈环排列,有m ...

  7. Codeforces Round 542 (Div. 2)

    layout: post title: Codeforces Round 542 (Div. 2) author: "luowentaoaa" catalog: true tags ...

  8. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  9. Codeforces Round #542 题解

    Codeforces Round #542 abstract I决策中的独立性, II联通块染色板子 IIIVoronoi diagram O(N^2 logN) VI环上距离分类讨论加取模,最值中的 ...

随机推荐

  1. java扫描控制台输入

    由于因最近练习算法的需要,加上API文档中翻译的太过模糊,做了一些小测试,算是武断的记下一些个人结论. Scanner cin = new Scanner(System.in); 对于cin.next ...

  2. synchronized 详细解说

    转自  http://blog.csdn.net/javazejian/article/details/72828483 出自[zejian的博客] 写的很详细很好,做下记录 本篇主要是对Java并发 ...

  3. 安卓客户端浏览器ajax注意

    这两天被一个bug搞疯了,就是公司安卓app上我负责的网页死活不进ajax,一开始我用的是post方式提交的,但是参数那一栏没写,直接把参数写在url上了,后来老大跟我说post不写参数会出问题,后来 ...

  4. C++ 学习笔记之——字符串和字符串流

    1. 字符数组 字符数组,也就是存放字符类型数据的数组,只不过字符数组的结尾必须是 '\0'.C++ 已经提供了一些字符串处理函数,这些函数被封装在头文件 和 <string.h> 中. ...

  5. Docker学习记录3: 搭建 Private Registry

    恩, Private Registry 特别好搭建, 只要依照官方文档, 很容易安装... https://docs.docker.com/registry/deploying/ 5000是个常用的端 ...

  6. QT打开文件路径中含有中文和空格问题

    使用qt-mingw版做的软件,发给客户以后说工作不正常,配置文件无法打开,或者加载数据文件不正常.远程查看以后,发现客户经常将程序放置在中文带空格的路径下,导致文件打开不正常.所以最近想在程序上解决 ...

  7. 普通Java类获取Spring的Bean的方法

    普通Java类获取Spring的Bean的方法 在SSH集成的前提下.某些情况我们需要在Action以外的类中来获得Spring所管理的Service对象. 之前我在网上找了好几好久都没有找到合适的方 ...

  8. 京东2018秋招c++岗 神奇数

    题意大概是: 一个数比如242,把所有数字分成两组,而且两组的和相等,那么这个数就是神奇数,此时242,能够分成{2,2}和{4},所以242是神奇数. 题目要求输入n和m求[n,m]区间内神奇数的个 ...

  9. “Hello World!”团队召开的第十二次会议

    今天是我们团队“Hello World!”团队召开的第十二次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 2 ...

  10. Java核心技术点之接口

    1. 为什么使用接口 Java中的接口是一组对需求的描述.接口通过声明接口方法来对外宣布:“要想具有XX功能,就得按我说的做(即实现接口方法).” 而接口的实现类通过实现相应接口的方法来宣布:“我已经 ...