Codeforces-542div2
https://www.cnblogs.com/31415926535x/p/10468017.html
codeforces-1130A~G
和队友做了一套题,,
A. Be Positive
题意
题意是给你一串整数,,要找到一个除数使得每一个数被除后正数的个数大于等于 \(\lceil \frac{n}{2} \rceil\),,,
分析
统计出所有正数,负数的个数,,正数多那个除数就是1,负数多就是-1
代码
//cf
#include <bits/stdc++.h>
//#include <iostream>
//#include <cstdio>
//#include <cstdlib>
//#include <string.h>
//#include <algorithm>
#define aaa cout<<233<<endl;
#define endl '\n'
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f;//1061109567
const ll linf = 0x3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = 3.14159265358979;
const int maxn = 1e6 + 5;
const int maxm = 2e5 + 5;
const ll mod = 1e9 + 7;
int a[maxn];
int main()
{
// freopen("233.in" , "r" , stdin);
// freopen("233.out" , "w" , stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n; cin >> n;
for(int i = 1; i <= n; ++i)cin >> a[i];
sort(a + 1, a + 1 + n);
int nump = 0;
int numn = 0;
for(int i = 1; i <= n; ++i)
if(a[i] > 0)
++nump;
else if(a[i] < 0)
++numn;
if(nump >= (n + 1) / 2)
cout << 1 << endl;
else if(numn >= (n + 1) / 2)
cout << -1 << endl;
else
cout << 0 << endl;
return 0;
}
B. Two Cakes
题意
题意是由两组1~n的数组成的序列,,每一个人选择一组,,费用是两个树之间的距离,,然后问你总距离最小是多少,,
分析
我一开始想着先贪心处理一个人的选择出最少的,,再加上剩下的那个人的,,然后就wa了,,因为这样并不保证这一次选的和下一次选的距离和是最小的,,解决方法是两个一起处理,,考虑每一种选择的情况,,这样取最小的就行了,,,
代码
//cf
#include <bits/stdc++.h>
//#include <iostream>
//#include <cstdio>
//#include <cstdlib>
//#include <string.h>
//#include <algorithm>
#define aaa cout<<233<<endl;
#define endl '\n'
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f;//1061109567
const ll linf = 0x3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = 3.14159265358979;
const int maxn = 1e6 + 5;
const int maxm = 1e4 + 5;
const ll mod = 1e9 + 7;
int a[maxn][2];
bool flag[maxn];
int main()
{
// freopen("233.in" , "r" , stdin);
// freopen("233.out" , "w" , stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n;cin >> n;
int t;
memset(flag, false, sizeof flag);
for(int i = 1; i <= 2 * n; ++i)
{
cin >> t;
if(!flag[t])
{
a[t][0] = i;
flag[t] = true;
}
else
a[t][1] = i;
}
ll ans = a[1][0] + a[1][1] - 2;
for(int i = 1; i <= n - 1; ++i)
{
int p = abs(a[i + 1][0] - a[i][0]) + abs(a[i + 1][1] - a[i][1]);
int q = abs(a[i + 1][0] - a[i][1]) + abs(a[i + 1][1] - a[i][0]);
ans += min(p, q);
}
cout << ans << endl;
return 0;
}
C. Connect
题意
给你一个地图,,其中陆地是0,水则是1,,然后给你一个起点一个终点,,你可以在任意两块陆地上建 一条 隧道使这两片陆地相通,,然后问你起点到终点需要的隧道的最小长度,,,
分析
因为只能建一条隧道,,所以如果起点所在的陆地与终点所在的陆地不相通的话,,那么这条隧道一定在这两片陆地之间,,数据量不大,,直接枚举这两片陆地上的点,,取最小的距离就行了,,,
判断一个点是否在起点或终点所在的陆地可以现用并查集把地图 “染色”,,,这样就可以枚举了,,,
代码
//cf
#include <bits/stdc++.h>
//#include <iostream>
//#include <cstdio>
//#include <cstdlib>
//#include <string.h>
//#include <algorithm>
#define aaa cout<<233<<endl;
#define endl '\n'
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f;//1061109567
const ll linf = 0x3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = 3.14159265358979;
const int maxn = 1e6 + 5;
const int maxm = 2e5 + 5;
const ll mod = 1e9 + 7;
int fa[maxn];
int _find(int x)
{
if(fa[x] == x)return x;
return fa[x] = _find(fa[x]);
}
void _union(int x, int y)
{
int f1 = _find(x);
int f2 = _find(y);
if(f1 != f2)fa[f1] = f2;
else fa[f2] = f1;
}
int mp[60][60];
int solve(int i, int j, int n)
{
int x1 = i / n;
int y1 = i - x1 * n;
int x2 = j / n;
int y2 = j - x2 * n;
if(y1 == 0)
{
y1 = n;
--x1;
}
if(y2 == 0)
{
y2 = n;
--x2;
}
// cout << x1 << y1 << x2 << y2 << endl;
return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}
int main()
{
// freopen("233.in" , "r" , stdin);
// freopen("233.out" , "w" , stdout);
// ios_base::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);
int n;scanf("%d", &n);
int x1, x2, y1, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
for(int i = 1; i <= n; ++i)
{
getchar();
for(int j = 1; j <= n; ++j)
mp[i][j] = (int)(getchar() - '0');
}
for(int i = n + 1; i <= n + 1 + n * n; ++i)fa[i] = i;
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
if(mp[i - 1][j] == mp[i][j] && i - 1 >= 1)
_union(i * n + j, (i - 1) * n + j);
if(mp[i + 1][j] == mp[i][j] && i + 1 <= n)
_union(i * n + j, (i + 1) * n + j);
if(mp[i][j + 1] == mp[i][j] && j + 1 <= n)
_union(i * n + j, i * n + j + 1);
if(mp[i][j - 1] == mp[i][j] && j - 1 >= 1)
_union(i * n + j, i * n + j - 1);
}
}
// for(int i = 1; i <=n; ++i)
// {
// for(int j = 1; j <= n; ++j)
// cout << _find(i * n + j) << " ";
// cout << endl;
// }
int s = _find(x1 * n + y1);
int t = _find(x2 * n + y2);
// cout << s << t << endl;
int ans = inf;
for(int i = n + 1; i <= n + 1 + n * n; ++i)
{
for(int j = 1 + n; j <= n + 1 + n * n; ++j)
{
if(_find(i) == s && _find(j) == t)
{
ans = min(ans, solve(i, j, n));
}
}
}
cout << ans << endl;
return 0;
}
D1. Toy Train
题意
由一个环形的铁路,,上面有n个车站,,每个车站有一些糖果,,这些糖果要运到 \(b_i\) 那个车站,,,火车只能在一个车站拉上一个糖果,,但是可以放下任意块糖果,,,问你从这n个车站出发送完所有的糖果所需的最少的时间,,
分析
每次只能上一个糖果,,最后下的糖果就是糖果数量最多的车站的,,找一个从这个车站出发花费最多的另一个车站,,这样把那个车站所有的糖果送完时其他车站的糖果顺带也就送完了,,,
枚举每一个车站i,,对于车站i枚举所有的其他的车站,,求出所有的时间里的最大值就是这个车站所用的时间了,,,
代码
//cf
#include <bits/stdc++.h>
//#include <iostream>
//#include <cstdio>
//#include <cstdlib>
//#include <string.h>
//#include <algorithm>
#define aaa cout<<233<<endl;
#define endl '\n'
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f;//1061109567
const ll linf = 0x3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = 3.14159265358979;
const int maxn = 1e6 + 5;
const int maxm = 1e4 + 5;
const ll mod = 1e9 + 7;
struct node
{
int num;
int mi;
}node[maxm];
int n, m;
int getdis(int i, int j)
{
//get the dis of i -> j
if(i <= j)return j - i;
else return n - i + j;
}
int solve(int loc)
{
//find the furthest and the most candies node
int fur = loc;
int num = node[loc].num;
int ans = 0;
int dis;
for(int i = loc; i <= n; ++i)
{
if(node[i].mi == inf)continue;
dis = getdis(loc, i) + (node[i].num - 1) * n + node[i].mi;
ans = max(ans, dis);
}
for(int i = 1; i <= loc - 1; ++i)
{
if(node[i].mi == inf)continue;
dis = getdis(loc, i) + (node[i].num - 1) * n + node[i].mi;
ans = max(ans, dis);
}
// for(int i = loc; i <= n; ++i)
// {
// if(node[i].num >= num)
// {
// fur = i;
// num = node[i].num;
// }
// }
// for(int i = 1; i <= loc - 1; ++i)
// {
// if(node[i].num >= num)
// {
// fur = i;
// num = node[i].num;
// }
// }
// cout << fur << " ";
// int ans = n * (node[fur].num - 1);
// ans += getdis(loc, fur);
// ans += getdis(fur, node[fur].mi);
return ans;
}
int main()
{
// freopen("233.in" , "r" , stdin);
// freopen("233.out" , "w" , stdout);
// ios_base::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);
cin >> n >> m;
int a, b;
for(int i = 1; i <= n; ++i)node[i].mi = inf;
for(int i = 1; i <= n; ++i)node[i].num = 0;
for(int i = 1; i <= m; ++i)
{
cin >> a >> b;
++node[a].num;
if(getdis(a, b) <= node[a].mi)
node[a].mi = getdis(a, b);
}
for(int i = 1; i <= n; ++i)
cout << solve(i) << " ";
cout << endl;
// for(int i = 1; i <= n; ++i)
// {
// cout << i << " ";
// cout << solve(i) << endl;
// }
return 0;
}
E. Wrong Answer
题意
一个数列求出最大的 区间和乘以区间长度,,
他给的算法当前面一段区间和出现负数就舍弃了,,没有考虑长度对最后答案的影响,,,
题目要我们构造一个数列,,使得这个数列的正确答案比它的做法算出的结果大k
分析
可以构造一个前面1998个都是0,,后面一个数是-p,一个时p + q,,,
这样正确的答案就是 \(2000q\),,,他算出的答案就是 \(p + q\),,,
要大k,,就是 \(2000q - (p+q)=k\),,也就是 \(q= \frac{p+k}{1999}\) ,,,为了保证p,q都是整数,,,那么就设 \(p=1999-k\%1999\),,这样算出的q就是整数,,,
//cf
#include <bits/stdc++.h>
//#include <iostream>
//#include <cstdio>
//#include <cstdlib>
//#include <string.h>
//#include <algorithm>
#define aaa cout<<233<<endl;
#define endl '\n'
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f;//1061109567
const ll linf = 0x3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = 3.14159265358979;
const int maxn = 1e6 + 5;
const int maxm = 1e4 + 5;
const ll mod = 1e9 + 7;
int main()
{
// freopen("233.in" , "r" , stdin);
// freopen("233.out" , "w" , stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int k; cin >> k;
cout << 2000 << endl;
for(int i = 1; i <= 2000 - 2; ++i)cout << 0 << " ";
int p = 1999 - k % 1999;
cout << -p << " " << ((k + p) / 1999 + p) << endl;
return 0;
}
(end)
Codeforces-542div2的更多相关文章
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
- CodeForces - 148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
- CodeForces - 453A Little Pony and Expected Maximum
http://codeforces.com/problemset/problem/453/A 题目大意: 给定一个m面的筛子,求掷n次后,得到的最大的点数的期望 题解 设f[i]表示掷出 <= ...
随机推荐
- Java并发编程(1)-Java内存模型
本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...
- Java 二进制I/O处理
在Java中如何处理文本I/O 使用Scanner类读取文本数据,使用PrintWriter类写文本数据 例子: public class IO { public static void main(S ...
- select 1
select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是 ...
- Bootstrap3.0学习第五轮(表格)
详情请查看 http://aehyok.com/Blog/Detail/11.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:h ...
- 转载:第2章 Nginx的配置 概述《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19623.html Nginx拥有大量官方发布的模块和第三方模块,这些已有的模块可以帮助我们实现Web服务器上很多的功能.使用这些模块 ...
- HDU1850 尼姆博弈求可行方案数目
尼姆博弈(Nimm's Game) 题型 尼姆博弈模型,大致上是这样的: 有3堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取1个,多者不限,最后取光者得胜. 分析 1.首先自己想一下 ...
- c++ primer 学习杂记2【派生类到基类转换的可访问性】
参考: http://blog.csdn.net/rehongchen/article/details/7930853 http://blog.csdn.net/ming_road/article/d ...
- DDD领域模型系统的工作流(十四)
在自定义的Windows窗体中运行工作流:(把工作流的代码放入到文本框中) public partial class Form1 : Form { public Form1() { Initializ ...
- python yield,到这个层次,才能叫深入哈
http://python.jobbole.com/88677/?utm_source=blog.jobbole.com&utm_medium=relatedPosts ~~~~~~~~~~~ ...
- la 4394
题解: 区间dp 令f[i][j]表示搞好i-j的最小值 首先如果不用涂色 那么可以从f[i][k] f[k+1][j]转移 如果要涂色,那么就从f[i][k][a](表示i-k全为a)+f[k+1] ...