Codeforces Beta Round #3

本文探讨了几个经典的算法问题,包括求解国王在棋盘上最短路径的问题及输出移动步骤,解决货车装载货物的贪心算法问题,并判断井字游戏的状态。此外,还介绍了一个最小成本括号序列问题,通过贪心策略来确定最优解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shortest path of the king

一个棋盘,横坐标用a-h表示,纵坐标用1-8表示,给你两个坐标求最少步数并输出路径(能往8个方向移动)。
直接判断x,y坐标的差
#include <cstdio>
#include <string>
#include <queue>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cmath>
#define ll __int64
using namespace std;
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
int main()
{
    char s[3],t[3];
	scanf("%s%s",s,t);
    int x=s[0]-'a'+1,y=s[1]-'0';
    int xx=t[0]-'a'+1,yy=t[1]-'0';
    int dx=xx-x,dy=yy-y;
    if(dx==0)
    {
    	printf("%d\n",abs(dy));
    	if(dy>0)
    	   for(int i=0;i<dy;i++)
		       puts("U");	
		else
		    for(int i=0;i<-dy;i++)
		       puts("D");
	}
	else if(dy==0)
	{
		printf("%d\n",abs(dx));
		if(dx>0)
    	   for(int i=0;i<dx;i++)
		       puts("R");	
		else
		    for(int i=0;i<-dx;i++)
		       puts("L");
	}
    else if(dx>0&&dy>0)
    {
    	printf("%d\n",max(dx,dy));
    	if(dx>dy)
    	{
    		for(int i=0;i<dy;i++)
    		   puts("RU");
    		for(int i=0;i<dx-dy;i++)
    		   puts("R");
		}
    	else
    	{
    		for(int i=0;i<dx;i++)
    		   puts("RU");
    		for(int i=1;i<dy-dx;i++)
    		   puts("U");
		}
	}
	else if(dx>0&&dy<0)
	{
		dy=-dy;
		printf("%d\n",max(dx,dy));
		if(dx>dy)
		{
		    for(int i=0;i<dy;i++)
			   puts("RD");
			for(int i=0;i<dx-dy;i++)
    		   puts("R");	
		}
		else
		{
			for(int i=0;i<dx;i++)
			   puts("RD");
			for(int i=0;i<dy-dx;i++)
    		   puts("D");
		}
	}
	else if(dx<0&&dy>0)
	{
		dx=-dx;
		printf("%d\n",max(dx,dy));
		if(dx>dy)
    	{
    		for(int i=0;i<dy;i++)
    		   puts("LU");
    		for(int i=0;i<dx-dy;i++)
    		   puts("L");
		}
    	else
    	{
    		for(int i=0;i<dx;i++)
    		   puts("LU");
    		for(int i=0;i<dy-dx;i++)
    		   puts("U");
		}
	}
	else if(dx<0&&dy<0)
	{
		dx=-dx;dy=-dy;
		printf("%d\n",max(dx,dy));
		if(dx>dy)
    	{
    		for(int i=0;i<dy;i++)
    		   puts("LD");
    		for(int i=0;i<dx-dy;i++)
    		   puts("L");
		}
    	else
    	{
    		for(int i=0;i<dx;i++)
    		   puts("LD");
    		for(int i=0;i<dy-dx;i++)
    		   puts("D");
		}
	}
}

Lorry

贪心,好多细节没考虑,WA了n遍....
#include <cstdio>
#include <string>
#include <queue>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#define ll __int64
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct node
{
	int p,v;
	int id;
} a[200010];
int vv[100050];
int cmp(node x,node y)
{
	if(1.0*x.v/x.p!=1.0*y.v/y.p)
		return 1.0*x.v/x.p>1.0*y.v/y.p;
	return x.p>y.p;
}
int main()
{
	int n,V;
	scanf("%d%d",&n,&V);
	int p1=0;
	int pos=0;
    int ans=0,ans1=0;
	for(int i=1; i<=n; i++)
	{
		a[i].id=i;
		scanf("%d%d",&a[i].p,&a[i].v);
		ans+=a[i].p;
		ans1+=a[i].v;
		if(a[i].p==1)
			p1++;
	}
	if(ans<V)
	{
		printf("%d\n",ans1);
		printf("1");
		for(int i=2;i<=n;i++)
		    printf(" %d",i);
		puts("");
		return 0;
	}
	sort(a+1,a+n+1,cmp);
	int sum=0,cnt=1;
	int flag=-1;
	while(1)
	{
		if(V==1||V==0)
			break;
		if(p1==1&&V%2==0&&a[cnt].p==1)
		{
			flag=cnt;
			p1--;
			cnt++;
			continue;
		}
		if(a[cnt].p==1)
			p1--;
		V-=a[cnt].p;
		sum+=a[cnt].v;
		vv[++pos]=a[cnt].id;
		cnt++;
		if(V==2&&flag!=-1)
		{
			flag=-1;
			if(cnt>n)
			{
				V-=a[flag].p;
				sum+=a[flag].v;
				vv[++pos]=a[flag].id;
			}
			else
			{
				if(a[cnt].v>a[flag].v)
				{
					V-=a[cnt].p;
					sum+=a[cnt].v;
					vv[++pos]=a[cnt].id;
				}
				else
				{
					V-=a[flag].p;
					sum+=a[flag].v;
					vv[++pos]=a[flag].id;
				}
			}
		}
		if(cnt>n)
			break;
	}
	if(V==1)
	{
		while(a[cnt].p!=1)
		{
			cnt++;
			if(cnt==n+1)
			   break;
		}
		if(cnt<=n)
		{
			V-=a[cnt].p;
			sum+=a[cnt].v;
			vv[++pos]=a[cnt].id;
		}
	}
	if(flag!=-1&&V>=1)
	{
		V-=a[flag].p;
		sum+=a[flag].v;
		vv[++pos]=a[flag].id;
	}
	printf("%d\n",sum);
	if(pos!=0) printf("%d",vv[1]);
	for(int i=2;i<=pos;i++)
		printf(" %d",vv[i]);
	puts("");
}


Tic-tac-toe

让你判断棋盘的状态,X先手,然后输出6种状态
firstsecondillegalthe first player wonthe second player won or draw
水题
#include <cstdio>
#include <string>
#include <queue>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#define ll __int64
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int xcnt;
int ocnt;
char ma[3][3];
int win(char c)
{
	for(int i=0;i<3;i++)
	{
		if(ma[i][0]==c&&ma[i][1]==c&&ma[i][2]==c) return 1;
		if(ma[0][i]==c&&ma[1][i]==c&&ma[2][i]==c) return 1;
	}
	if(ma[1][1]!=c) return 0;
	if(ma[0][0]==c&&ma[2][2]==c) return 1;
	if(ma[0][2]==c&&ma[2][0]==c) return 1;
	return 0;
}
int legal()
{
	if (xcnt - ocnt > 1) return 0;
	if (xcnt - ocnt < 0) return 0;
	if (win('X') && xcnt == ocnt) return 0;
	if (win('0') && xcnt - ocnt == 1) return 0;
	return 1;
}
int main()
{
	xcnt=0;
	ocnt=0;
	for(int i=0;i<3;i++)
	{
		scanf("%s",ma[i]);
		for(int j=0;j<3;j++)
		{
			xcnt+=(ma[i][j]=='X');
			ocnt+=(ma[i][j]=='0');
		}
	}
	if(!legal())
		printf("illegal\n");
	else if(win('X'))
		printf("the first player won\n");
	else if(win('0'))
		printf("the second player won\n");
	else if(xcnt+ocnt==9)
		printf("draw\n");
	else if(xcnt==ocnt)
		printf("first\n");
	else if(xcnt-ocnt==1)
		printf("second\n");
}

Least Cost Bracket Sequence


题意:给你一串字符串,?可以是'('或者')',有m个?,接下来m行代表?变成(,)的花费,求最小花费。
直接贪心,想到了比较简单,cstring头文件没写CE4发..
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
char s[50005];
int a[50005],b[50005];
struct cmp
{
    bool operator()(int x,int y)
    {
        return a[x]-b[x]>a[y]-b[y];
    }
};
int main()
{
    scanf("%s",s);
    int len=strlen(s);
    if(len&1)
    {
        puts("-1");return 0;
    }
    int i=0;
    while(i<len)
    {
        if(s[i]=='?')
            scanf("%d%d",&a[i],&b[i]);
        i++;
    }
    priority_queue<int,vector<int>,cmp> q;
    int pos=0;
    ll cost=0;
    for(int i=0;i<len;i++)
    {
        if(s[i]=='(')
            pos++;
        else if(s[i]==')')
            pos--;
        else
        {
            s[i]=')';
            pos--;
            cost+=b[i];
            q.push(i);
        }
        if(pos<0)
        {
            if(q.empty()) break;
            int cur=q.top();
            q.pop();
            s[cur]='(';
            cost+=a[cur]-b[cur];
            pos+=2;
        }
    }
    if(pos==0) {printf("%lld\n",cost); puts(s);}
    else puts("-1");
}



### 关于 Codeforces Round 839 Div 3 的题目与解答 #### 题目概述 Codeforces Round 839 Div 3 是一场面向不同编程水平参赛者的竞赛活动。这类比赛通常包含多个难度层次分明的问题,旨在测试选手的基础算法知识以及解决问题的能力。 对于特定的比赛问题及其解决方案,虽然没有直接提及 Codeforces Round 839 Div 3 的具体细节[^1],但是可以根据以往类似的赛事结构来推测该轮次可能涉及的内容类型: - **输入处理**:给定一组参数作为输入条件,这些参数定义了待解决的任务范围。 - **逻辑实现**:基于输入构建满足一定约束条件的结果集。 - **输出格式化**:按照指定的方式呈现最终答案。 考虑到提供的参考资料中提到的其他几场赛事的信息[^2][^3],可以推断出 Codeforces 圆桌会议的一般模式是围绕着组合数学、图论、动态规划等领域展开挑战性的编程任务。 #### 示例解析 以一个假设的例子说明如何应对此类竞赛中的一个问题。假设有如下描述的一个简单排列生成问题: > 对于每一个测试案例,输出一个符合条件的排列——即一系列数字组成的集合。如果有多种可行方案,则任选其一给出即可。 针对上述要求的一种潜在解法可能是通过随机打乱顺序的方式来获得不同的合法排列形式之一。下面是一个 Python 实现示例: ```python import random def generate_permutation(n, m, k): # 创建初始序列 sequence = list(range(1, n + 1)) # 执行洗牌操作得到新的排列 random.shuffle(sequence) return " ".join(map(str, sequence[:k])) # 测试函数调用 print(generate_permutation(5, 2, 5)) # 输出类似于 "4 1 5 2 3" ``` 此代码片段展示了怎样创建并返回一个长度为 `k` 的随机整数列表,其中元素取自 `[1..n]` 这个区间内,并且保证所有成员都是唯一的。需要注意的是,在实际比赛中应当仔细阅读官方文档所提供的精确规格说明,因为这里仅提供了一个简化版的方法用于解释概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值