CAIP 省赛第三题

题目大意

给定一个字符串,字符串为加减运算表达式,其中的字符由数字XdY组成,其中XdY代表的是X个Y面的骰子,假定这种骰子是存在的,对于XdY他的取值可以取到[X,Y∗X][X,Y*X][X,YX],对于给定的字符串,求出他的最大值和最小值,并输出每种骰子有多少个。

思路

模拟题,注意细节。。

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

typedef long long ll;
const int N = 1e5+10;

string s;

ll ans;
ll ans1, ans2;
map<int, int>cnt;	

void print() {
	for (auto p : cnt)
	{
		cout << p.first << ' ' << p.second << endl;
	}

	cout << ans2 + ans << " " << ans1 + ans;

}
void getan() {
	s = "+" + s + "+";
	ll num = 0, fff = 0;
	bool flag = false;
	bool op = true;
	for (int i = 0; i < s.size(); i++)
	{
		auto t = s[i];
		if (t == '+' || t == '-')
		{
			if (!flag)
			{
				if (op)	ans += fff;
				else ans -= fff;
				fff = 0;
			}
			else
			{
				cnt[fff] += num;

				if (op)
				{
					ans1 += num * fff;
					ans2 += num;
				}
				else
				{
					ans1 -= num;
					ans2 -= num * fff;
				}

			}
			fff = 0; num = 0;
			flag = false;

			if (t == '+')	op = true;
			else op = false;
		}
		else if (t == 'd')
		{
			if (s[i - 1] == '+' || s[i - 1] == '-')
				fff = 1;

			num = fff;
			fff = 0;
			flag = true;
		}
		else
		{
			fff = fff * 10 + t - '0';
		}
	}
}
int main()
{
	cin >> s;
	getan();
	print();
	return 0;
}

CAIP编程竞(睿抗CAIP编程技能)是面向高校本科生的一项重要事,旨在提升学生的算法设计、逻辑思维以及编程实现能力。以下是关于本科生组比规则、报名方式和历年试的详细信息。 ### 比规则 - **参对象**:全国高校在读本科生均可参加。 - **比形式**:分为初与决两个阶段,初通常为线上进行,决为线下集中比或线上远程监考模式。 - **编程语言**:主要支持C/C++、Java、Python等主流编程语言。 - **题目类型**:包括但不限于模拟、动态规划、贪心算法、图论、数据结构相关问等[^1]。 - **评分标准**:根据提交程序的正确性、运行效率以及代码质量进行评分。 - **时间限制**:每场比通常持续2~3小时,包含5~8道题目。 ### 报名方式 - **报名平台**:通过睿抗事官网或指定合作平台(如牛客网、蓝桥杯竞平台等)进行注册报名。 - **报名时间**:一般每年4月至6月开放初报名通道。 - **费用说明**:部分年份可能提供免费参机会,具体情况以当年官方通知为准。 - **组队要求**:个人制,每位选手独立完成所有题目。 ### 历年试特点 - **难度分布**:涵盖简单模拟、中等难度算法应用及较难题目,适合不同水平的学生参与挑战。 - **典型型示例**: - 动态规划类问,如工作调度问、资源分配问等。 - 贪心策略,例如金钱管理、任务选择等场景。 - 数据结构操作,包括线段树、并查集、堆栈、队列等高级用法。 - 图论基础问,如最短路径、最小生成树、拓扑排序等。 - **学习资源**:可通过往年真回顾、解分析来提高实战能力。例如,某年第二涉及模拟加贪心策略,用于判断是否超过金额上限并计数消费次数,其核心思想在于对当前金额的维护与条件判断处理[^2]。 以下是一个该C++实现示例: ```cpp #include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { LL n, m; cin >> n >> m; LL now = 0, ans = 0; for (int i = 1; i <= n; ++i) { LL x; cin >> x; if (now + x > m) { ans++; now = 0; } now += x; } cout << ans << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值