CodeForces 1073C (二分答案)

本文详细解析了Codeforces平台上的1073C问题,通过优化GCC编译指令,使用C++标准库进行高效算法实现。文章展示了如何初始化坐标系并检查路径长度的有效性,最终确定最短路径。

任重而道远

题目链接:http://codeforces.com/problemset/problem/1073/C

AC代码:

#pragma optimize GCC ("O2")
#include<bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;
char s[N];
int n, p, q, x[N], y[N];

int read () {
	int x = 0, f = 0; char c = getchar ();
	while (!isdigit (c)) f |= (c == '-'), c = getchar ();
	while (isdigit (c)) x = x * 10 + c - '0', c = getchar ();
	return f ? -x : x;
}

void init () {
	int a = 0, b = 0;
	for (int i = 1; i <= n; i++) {
		if (s[i] == 'U') b += 1;
		if (s[i] == 'D') b -= 1;
		if (s[i] == 'L') a -= 1;
		if (s[i] == 'R') a += 1;
		x[i] = a, y[i] = b;
	}
}

bool check (int len) {
	for (int i = 1; i + len - 1 <= n; i++) {
		int dx = p - (x[i - 1] + x[n] - x[i + len - 1]), dy = q - (y[i - 1] + y[n] - y[i + len - 1]);
		int delta = abs (dx) + abs (dy);
		if (len >= delta && !((len - delta) & 1)) return true;
	}
	return false;
}

int main () {
	n = read ();
	scanf ("%s", s + 1);
	p = read (), q = read ();
	if (abs (p) + abs (q) > n || (n - abs (p) - abs (q)) & 1) return puts ("-1");
	init ();
	int lf = 0, rg = n;
	while (lf <= rg) {
		int mid = lf + rg >> 1;
		if (check (mid)) rg = mid - 1;
		else lf = mid + 1;
	}
	return !printf ("%d\n", lf);
}

 

&lt;think&gt;好的,用户需要寻找在线评测平台(OJ)上的C语言练习题和对应的解答。首先,我得回忆一下常见的OJ平台,比如LeetCode、HackerRank、Codeforces等。这些平台都提供大量的编程题目,但用户特别提到需要C语言的题目和解答,可能需要重点推荐支持C语言的平台。 然后,用户可能希望得到具体的题目例子和解答,所以我应该提供几个典型的问题,比如&ldquo;两数之和&rdquo;或者&ldquo;反转链表&rdquo;,并用C语言写出示例代码。同时,要确保代码符合C语言的语法规范,避免使用C++的特性。 另外,用户提到需要对应的解决方案,这意味着每个问题后面需要附上解答代码,并且可能需要解释解题思路。但根据用户的要求,可能更倾向于直接提供代码,而不是详细的解释,但最好还是简要说明一下,这样用户更容易理解。 接下来,需要考虑用户可能的水平。如果是初学者,可能需要推荐一些入门级的题目和平台;如果是进阶用户,可能需要更复杂的题目。但用户的问题中没有明确说明,所以应该覆盖不同难度的平台,比如浙江大学ZOJ适合新手,而Codeforces适合有一定经验的用户。 还要注意,有些平台可能主要支持其他语言,比如LeetCode虽然支持C,但很多讨论和解答可能用其他语言编写,需要指出这一点,并建议用户查看题解区是否有C的答案,或者自行转换代码。 此外,用户可能需要知道如何访问这些平台,所以应该提供平台的全称和网址,方便用户查找。例如HackerRank的网址是hackerrank.com,但可能不需要在回答中直接写链接,只需给出名称即可。 最后,生成相关问题,比如如何选择适合的OJ平台,或者如何提升C语言编程能力,这样可以帮助用户进一步探索学习路径。同时,确保回答中的引用正确,比如引用提供的参考资料,但根据用户给出的引用内容,可能和OJ平台关系不大,所以需要检查是否有相关引用可用,如果没有,可能不需要添加引用标识,或者仅在有相关的地方添加。 总结步骤:1. 列出常见的OJ平台,强调支持C语言的;2. 提供题目示例和解答代码;3. 简要说明解题思路;4. 生成相关问题供用户参考。&lt;/think&gt;### 在线评测平台(OJ)C语言练习题及解答推荐 #### 一、主流OJ平台及特点 1. **LeetCode** 提供$2000+$算法题,支持C语言提交,题目分类清晰(数组、字符串、动态规划等)。例如题目《两数之和》的C语言解法: ```c int* twoSum(int* nums, int numsSize, int target, int* returnSize) { int* result = malloc(2 * sizeof(int)); for (int i = 0; i &lt; numsSize; i++) { for (int j = i + 1; j &lt; numsSize; j++) { if (nums[i] + nums[j] == target) { result[0] = i, result[1] = j; *returnSize = 2; return result; } } } *returnSize = 0; return NULL; } ``` 注意:LeetCode题解区多为Python/Java,但C语言逻辑可参考[^1]。 2. **HackerRank** 侧重基础语法训练,适合新手。例如《打印Hello World》: ```c #include &lt;stdio.h&gt; int main() { printf(&quot;Hello, World!&quot;); return 0; } ``` 3. **Codeforces** 竞赛级题目,适合进阶训练。例如《A + B Problem》的C实现: ```c #include &lt;stdio.h&gt; int main() { int a, b; scanf(&quot;%d %d&quot;, &amp;a, &amp;b); printf(&quot;%d\n&quot;, a + b); return 0; } ``` #### 二、题目与解答示例 **题目1:反转链表(LeetCode 206)** 要求:将单链表反转,返回新头节点。 ```c struct ListNode* reverseList(struct ListNode* head) { struct ListNode *prev = NULL, *curr = head; while (curr) { struct ListNode *next = curr-&gt;next; curr-&gt;next = prev; prev = curr; curr = next; } return prev; } ``` **题目2:最大子序和(LeetCode 53)** 要求:找到整数数组中连续子数组的最大和。 ```c int maxSubArray(int* nums, int numsSize) { int max_sum = nums[0], current_sum = nums[0]; for (int i = 1; i &lt; numsSize; i++) { current_sum = fmax(nums[i], current_sum + nums[i]); max_sum = fmax(max_sum, current_sum); } return max_sum; } ``` #### 三、获取解答的建议 1. 平台内置题解:部分OJ(如LeetCode)提供官方解答或用户提交的代码。 2. GitHub仓库:搜索关键词如`leetcode-c-solutions`,可找到系统性整理[^3]。 3. 技术博客:优快云、掘金等社区有详细题解分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值