您的位置:首页 > 其它

Educational Codeforces Round 35 (Rated for Div.2)

2017-12-30 11:00 330 查看
A.Nearest Minimums

题意:给出一个数列,要求找出所有最小值间的最小间隔。

直接先扫一遍找出最小值,然后将最小值取出来单独构造一个数列,再扫一遍新数列即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define maxn 100050
#define INF 0x3f3f3f3f
#define eps 1e-8
typedef long long ll;
using namespace std;

int n;
int m;
struct node
{
int a;
int num;
}e[maxn], w[maxn];

int main()
{
scanf("%d", &n);
m = 0;
int minn = INF;
for (int i = 0; i < n; i++)
scanf("%d", &e[i].a), e[i].num = i, minn = min(minn, e[i].a);
for (int i = 0; i < n; i++)
{
if (e[i].a == minn)
w[m++] = e[i];
}
int minnn = INF;
for (int i = 0; i < m - 1; i++)
minnn = min(minnn, w[i + 1].num - w[i].num);
cout << minnn << endl;
return 0;
}


B.Two Cakes

题意:有两种蛋糕分别有a块和b块。现在要将所有的蛋糕放到n个盘子里,所有的盘子都必须放蛋糕并且不能同时放两种蛋糕。问所有盘子最小的蛋糕数的最大值是多少。

由于题目要求的是令最小值最大,因此需要保证的是蛋糕数目对盘子数目取整,多出的蛋糕不影响最终结果。又由于两种蛋糕不能放在同一个盘子里,因此需要把两种蛋糕分别取整。从蛋糕总数目向下遍历找到符合条件的最大值即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define maxn 100050
#define INF 0x3f3f3f3f
#define eps 1e-8
typedef long long ll;
using namespace std;

int n, a, b;
int main()
{
scanf("%d%d%d", &n, &a, &b);
int i;
for (i = min(a, b); i; i--)
{
if (a / i + b / i >= n)break;
}
cout << i << endl;
return 0;
}


C.Three Garlands

题意:有三盏灯分别以k1、k2、k3秒的周期闪烁,问能否确定每盏灯第一次闪烁的时间,使得从某一时刻开始每一秒钟都有至少一盏灯亮着。

只有三盏灯,要覆盖一个右侧开区间上所有的整数。首先如果有一盏灯的周期是1秒,那么必定能够覆盖。另外如果有两盏灯的周期都是2,也是可以全部覆盖的,只需要让两盏灯分别覆盖偶数和奇数。在排除上述两条件后一般的情况是:如果有一盏灯的周期不小于4,那么必定不能全部覆盖。但是有两种特解:4/4/2是YES而3/3/2是NO,原因是可以用两个4覆盖所有的偶数或奇数。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define maxn 100050
#define INF 0x3f3f3f3f
#define eps 1e-8
typedef long long ll;
using namespace std;

int a, b, c;
int main()
{
scanf("%d%d%d", &a, &b, &c);
int maxx = 0, minn = INF;
if (a > b)swap(a, b);
if (a > c)swap(a, c);
if (b > c)swap(b, c);
maxx = max(a, max(b, c));
minn = min(a, min(b, c));
if (a == 2 && b == 2)cout << "YES" << endl;
else if ((a == 2 && b == 4 && c == 4))cout << "YES" << endl;
else if (maxx >= 4 && minn != 1)cout << "NO" << endl;
else if (a == 2 && b == 3 && c == 3)cout << "NO" << endl;
else cout << "YES" << endl;
return 0;
}


D.Inversion Counting

题意:给
4000
出一个长度为n的数组。现在进行m次查询,每次将区间[a,b]的所有数字倒序排列后,查询整个数组的逆序数的奇偶性。

此题需要了解线性代数中的一个结论:当交换数列中两个数字的位置时,数列的逆序数改变1。也就是说我们将t个数逆序排列时,所交换的整数对数目是C(t,2)即t*(t-1)/2,这也是数列逆序数改变的数目。由于我们只需要判断逆序数的奇偶性,因此只需要求出初始时数列的逆序数,在每次查询时更改交换的数对数目只判断奇偶性即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define maxn 100050
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;
typedef long long ll;

int n, m, x, y;
int a[maxn];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
int tmp = 0;
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
if (a[i] > a[j])tmp++;
}
int cnt = tmp % 2;
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> x >> y;
int t = y - x + 1;
cnt += (t*(t - 1) / 2) % 2;
cnt %= 2;
if (cnt == 1)cout << "odd" << endl;
else cout << "even" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces