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. 在使用Pipeline串联多个stage时model和非model的区别

    train.csv数据: id,name,age,sex1,lyy,20,F2,rdd,20,M3,nyc,18,M4,mzy,10,M 数据读取: SparkSession spark = Spar ...

  2. JQuery常用函数方法全集

    Attribute: $("p").addClass(css中定义的样式类型); 给某个元素添加样式 $("img").attr({src:"test ...

  3. HDU 4302 Holedox Eating (线段树模拟)

    题意:一个老鼠在一条长度为L的直线上跑,吃蛋糕,老鼠只能沿直线移动.开始时没有蛋糕,老鼠的初始位置是0. 有两个操作,0 x 代表在位置x添加一个蛋糕: 1 代表老鼠想吃蛋糕.老鼠每次都会选择离自己最 ...

  4. 【转】jQuery最佳实践

    上周,我整理了<jQuery设计思想>. 那篇文章是一篇入门教程,从设计思想的角度,讲解"怎么使用jQuery".今天的文章则是更进一步,讲解"如何用好jQu ...

  5. 关于set和get机制的整理

    首先这是es5新增的:定义是设置和获取对象属性时候出发的方法,属于修饰器: 犀牛书例子: function test(n){ return { get count(){ return n }, set ...

  6. Java中的线程同步

    Java 中的线程同步问题: 1. 线程同步: 对于访问同一份资源的多个线程之间, 来进行协调的这个东西. 2. 同步方法: 当某个对象调用了同步方法时, 该对象上的其它同步方法必须等待该同步方法执行 ...

  7. Objective-C 反射机制

    该文章属于<简书 — 刘小壮>原创,特此感谢:<简书 — 刘小壮> http://www.jianshu.com/p/5bbde2480680 了解反射机制 Objective ...

  8. TCP系列12—重传—2、Linux超时重传引入示例

    在前面我们概述了TCP的超时重传之后我们简单的看一下tcp超时重传的示例.首先简单的描述一下测试过程 1.设置/proc/sys/net/ipv4/tcp_early_retrans为2,关掉TLP功 ...

  9. 201621123034 《Java程序设计》第5周学习总结

    作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:关键字:接口.继承.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般 ...

  10. Android 布局方式学习

    一.LinearLayout线性布局: 线性布局是程序中最常见的一种布局方式,线性布局可以分为水平线性布局和垂直线性布局两种, 通过android:orientation属性可以设置线性布局的方向 1 ...