Educational Codeforces Round 49 (Rated for Div. 2)ABCD题解

A

题意大概就是给出一个字符串,每个字符必须变成它的前一个或后一个(a和z只能变成1个),问你能不能变成一个回文串

直接两个指针同时从中间向两边挪,暴力模拟即可

#include <bits/stdc++.h>
using namespace std;

#define Y puts("YES")
#define N puts("NO")

const int MAXN = 200;
const int INF = 0x3f3f3f3f;

template <typename T> inline void read(T &x) {
    int c = getchar();
    bool f = false;
    for (x = 0; !isdigit(c); c = getchar()) {
        if (c == '-') {
            f = true;
        }
    }
    for (; isdigit(c); c = getchar()) {
        x = x * 10 + c - '0';
    }
    if (f) {
        x = -x;
    }
}

int T, n;
char s[MAXN];

signed main() {
	read(T);
	while(T --) {
		read(n);
		scanf("%s", s);
		int len = strlen(s);
		int mid = (len >> 1);
		int r = mid, l = mid - 1;
		bool fg = 0;
		while(r < len && l >= 0) {
			if(s[l] == 'a') {
				if(s[r] != 'a' && s[r] != 'c') {
					fg = 1;
					N;
					break;
				}
			}
			else if(s[l] == 'z') {
				if(s[r] != 'z' && s[r] != 'x') {
					fg = 1;
					N;
					break;
				}
			}
			else {
				if(s[r] - 1 == s[l] + 1) fg = 0;
				else if(s[r] + 1 == s[l] - 1) fg = 0;
				else if(s[r] == s[l]) fg = 0;
				else {
					fg = 1;
					N;
					break;
				}
			}
			l--, r++;
			//printf("!!!%d %d\n", l, r);
		}
		if(!fg) Y;
	}
	return 0;
}

B

说实话这题没太看懂,大概意思是1-n^2/2的数从左往右从上往下只填奇数行奇数列和偶数行偶数列,剩下的相反,给出(x,y),求其对应的数。

其实看看就知道是个公式题,算是很好推的了,具体看代码

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100100;
const int INF = 0x3f3f3f3f;

template <typename T> inline void read(T &x) {
    int c = getchar();
    bool f = false;
    for (x = 0; !isdigit(c); c = getchar()) {
        if (c == '-') {
            f = true;
        }
    }
    for (; isdigit(c); c = getchar()) {
        x = x * 10 + c - '0';
    }
    if (f) {
        x = -x;
    }
}

#define LL long long

LL n, x, y, ans;
int q;

signed main() {
	read(n);
	if(n & 1) {
		read(q);
		while(q--) {
			ans = 0;
			read(x), read(y);
			if(x & 1) {
				if(y & 1) {
					ans += (x >> 1) * (n >> 1) + (x >> 1) * ((n >> 1) + 1);
					ans += ((y + 1) >> 1);
				}
				else {
					ans += (n * n / 2) + 1;
					ans += (x >> 1) * (n >> 1) + (x >> 1) * ((n >> 1) + 1);
					ans += (y >> 1);
				}
			}
			else {
				if(y & 1) {
					ans += (n * n / 2) + 1;
					ans += (x >> 1) * (n >> 1) + ((x >> 1) - 1) * ((n >> 1) + 1);
					ans += ((y + 1) >> 1);
				}
				else {
					ans += (x >> 1) * ((n >> 1) + 1) + ((x >> 1) - 1) * (n >> 1);
					ans += (y >> 1);
				}
			}
			printf("%I64d\n", ans);
		}
	}
	else {
		read(q);
		while(q--) {
			ans = 0;
			read(x), read(y);
			if(x & 1) {
				if(y & 1) {
					ans += (x - 1) * (n >> 1);
					ans += ((y + 1) >> 1); 
				}
				else {
					ans += (n * n / 2);
					ans += (x - 1) * (n >> 1);
					ans += (y >> 1);
				}
			}
			else {
				if(y & 1) {
					ans += (n * n / 2);
					ans += (x - 1) * (n >> 1);
					ans += ((y + 1) >> 1);
				}
				else {
					ans += (x - 1) * (n >> 1);
					ans += (y >> 1);
				}
			}
			printf("%I64d\n", ans);
		}
	}
	return 0;
}

C,

大意是从一些长度的木棍中选出四根组成一个矩形,要求矩形的周长平方除以面积的商最小,求长宽x和y

将这个式子写成(2x + 2y) ^ 2 / xy,转化一下,由均值不等式得当x==y时该式最小

然后,假设a < b < c, 设上式为一个函数f(x, y),则f(a, b) < f(a, c),f(b, c) < f(a, c)

所以将所有有至少两根的木棍长度排序,计算相领的两个长度的f(x, y)值,取最小

如果有4个一样长度的直接输出

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1000100;
const int INF = 0x3f3f3f3f;

template <typename T> inline void read(T &x) {
    int c = getchar();
    bool f = false;
    for (x = 0; !isdigit(c); c = getchar()) {
        if (c == '-') {
            f = true;
        }
    }
    for (; isdigit(c); c = getchar()) {
        x = x * 10 + c - '0';
    }
    if (f) {
        x = -x;
    }
}

#define LL long long

int T, n, l1, l2;
int a[MAXN], sum[MAXN / 30];
vector<int> v;

signed main() {
	read(T);
	while(T--) {
		read(n);
		bool fg = 0;
		memset(sum, 0, sizeof(sum));
		v.clear();
		for(int i = 1; i <= n; i++) {
			read(a[i]);
			sum[a[i]]++;
			if(sum[a[i]] == 4 && !fg) {
				printf("%d %d %d %d\n", a[i], a[i], a[i], a[i]);
				fg = 1;
			}
			if(sum[a[i]] == 2) {
				v.push_back(a[i]);
			}
		}
		if(fg) continue;
		sort(v.begin(), v.end());
		double dlt = 1e50;
		for(int i = 0; i < (int) v.size() - 1; i++) {
			double x = (double) v[i], y = (double) v[i + 1];
			double tmp = 8.000 + 4.000 * (x / y + y / x);
			if(tmp < dlt) {
				l1 = v[i], l2 = v[i + 1];
				dlt = tmp;
			}
		}
		printf("%d %d %d %d\n", l1, l2, l2, l1);
	}
	return 0;
}

D

一道tarjan的题,大概相当于求一个有向图中所有的出度为0的SCC,没什么好说的,看出来了之后做法就很粗暴了,具体可参看popular cow

#include <bits/stdc++.h>
using namespace std;

const int MAXM = 10010;
const int INF = 0x3f3f3f3f;

template <typename T> inline void read(T &x) {
    int ch = getchar();
    bool f = false;
    for (x = 0; !isdigit(ch); ch = getchar()) {
        if (ch == '-') {
            f = true;
        }
    }
    for (; isdigit(ch); ch = getchar()) {
        x = x * 10 + ch - '0';
    }
    if (f) {
        x = -x;
    }
}

#define LL long long

const int MAXN = 200100;
const int MAXE = 600400;

using std::min;

struct Edge {
    int to, nxt;
    Edge() {}
    Edge(int _to, int _nxt) : to(_to), nxt(_nxt) {}
}E[MAXE];

int h[MAXN], ins[MAXN], dfn[MAXN], Clock_t, Stack[MAXN], SCC;
int top, belong[MAXN], in[MAXN], sz[MAXN], cnt, low[MAXN];
int vis[MAXN], n, m;

inline void add_edge(int u, int v) {
    E[++cnt] = Edge(v, h[u]), h[u] = cnt;
    //E[++cnt] = Edge(u, h[v]), h[v] = cnt;
}

int a[MAXN], c[MAXN];

void Tarjan(int x) {
    ins[x] = 1;
    low[x] = dfn[x] = ++Clock_t;
    Stack[++top] = x;
    for(int i = h[x]; ~i; i = E[i].nxt) {
        int v = E[i].to;
        if(!dfn[v]) {
            Tarjan(v);
            low[x] = min(low[x], low[v]);
        }
        else if(ins[v]) low[x] = min(low[x], low[v]);
    }
    if(low[x] == dfn[x]) {
        SCC++;int v;
        do {
            v = Stack[top--];
            ins[v] = 0;
            belong[v] = SCC;
            sz[SCC] = min(sz[SCC], c[v]);
        }while(v != x);
    }
    return ;
}

int out[MAXN];

signed main() {
	read(n); memset(h, -1, sizeof(h)); memset(sz, 0x3f, sizeof(sz));
	for(int i = 1; i <= n; i++) read(c[i]);
	for(int i = 1; i <= n; i++) read(a[i]), add_edge(i, a[i]);
	for(int i = 1; i <= n; i++) {
		if(!dfn[i])
			Tarjan(i);
	}
	int ans = 0;
	for(int i = 1; i <= n; i++) {
		for(int x = h[i]; ~x; x = E[x].nxt) {
			int v = E[x].to;
			if(belong[i] != belong[v]) out[belong[i]]++; 
		}
	}
	for(int i = 1; i <= SCC; i++) {
		if(!out[i]) ans += sz[i];
	}
	printf("%d\n", ans);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
疫情居家办公系统管理系统按照操作主体分为管理员和用户。管理员的功能包括办公设备管理、部门信息管理、字典管理、公告信息管理、请假信息管理、签到信息管理、留言管理、外出报备管理、薪资管理、用户管理、公司资料管理、管理员管理。用户的功能等。该系统采用了MySQL数据库,Java语言,Spring Boot框架等技术进行编程实现。 疫情居家办公系统管理系统可以提高疫情居家办公系统信息管理问题的解决效率,优化疫情居家办公系统信息处理流程,保证疫情居家办公系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理疫情居家办公系统信息,包括外出报备管理,培训管理,签到管理,薪资管理等,可以管理公告。 外出报备管理界面,管理员在外出报备管理界面中可以对界面中显示,可以对外出报备信息的外出报备状态进行查看,可以添加新的外出报备信息等。签到管理界面,管理员在签到管理界面中查看签到种类信息,签到描述信息,新增签到信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值