CF Round #348 Div. 2 A. Little Artem and Present B. Little Artem and Grasshopper C. Little Artem and

今天起开始刷CF,不知道能坚持多久,希望不要放弃,编程这东西一放就忘。

关于解题,能用语言描述的东西就不画图了,下面进入正题。


A. Little Artem and Present

题意:

小A有一些石子,想作为礼物送给小M。小M不在意送的礼物是否为贵重,而在意送礼物的次数。如果是送石子,小M还记得上次送了几个石子,所以小A为了讨好小M,需要保证送礼物次数尽可能多并且每次送的数量和上次不同。

问当小A有n个石子的时候,最多可以送几次?

显然,每次送石头数至少为1。如果上次送1个,本次最少送2个。如果上次送2个,本次又可以送1个。即有3个石子就可以完成2次送礼,n含有m个3就可以送2*m次,剩下如果还有石子,则可以再送一次,

故送礼次数=n / 3 + ((n % 3 == 0) ? 0 : 1)

代码:

#include <iostream>
using namespace std;

int main() {
	int n;
	while(cin >> n) {
		cout << (n / 3 * 2 + ((n % 3 == 0)? 0 : 1)) << endl;
	}
	return 0;
} 



B. Little Artem and Grasshopper

题意:

跳格子游戏,有1 x n大小的格子,每个格子上标明跳的方向(< 和 >)以及需要跳的格子数。参与者从第一个格子开始跳,并遵循格子上的指示,问能否跳出格子(前后均算跳出)?

首先要记录自己当前位置,该变量的值代表当前所处的位置。同时, 从第一个格子开始,每跳一个格子,注意标记该格子已被跳过。如果下回再次跳到这个格子,说明存在死循环,是永远跳不出去的;或者某次计算得到当前位置不在整个格子范围内,则表明已经跳出整个格子。

代码:


#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
	// 获取输入 
	int n;
	cin >> n;
	string str;
	cin >> str;
	int* num = new int[n];
	for (int i = 0, tmp = 0; i < n; i++) {
		cin >> tmp;
		num[i] = (str[i] == '<') ? -tmp : tmp;
	}
	// 初始位置为0,开始跳格子 
	int pos = 0;
	map<int, int> m;
	for (m[0] = 0; pos >= 0 && pos < n; m[pos] = 0) {
		//根据当前位置需要跳格子数得到新位置 
		pos += num[pos];
		// 如果新位置以前来过,说明进入循环,怎么也跳不出去了 
		if (m.find(pos) != m.end()) {
			delete[] num;
			cout << "INFINITE" << endl;
			return 0;
		}
	}
	// 跳出格子 
	delete[] num;
	cout << "FINITE" << endl;
	return 0;
}


C. Little Artem and Matrix

题意:

有一个电子设备,大小n行 x m列,与数组类似,每个位置均可存数据,并遵循如下规则:

1. 每行每列均可接收输入信号,即m+n个输入;

2. 当第 i 行收到信号时,第 i 行的元素值循环左移(第 1 个变最后 1 个,第 2 个变第 1 个);

3. 当第 j 列收到信号时,第 j 列的元素循环上移;

操作方面,1 n 表示第 n 行收到信号,2 n 表示第 n 列收到信号,3 x y w 表示此时测得(x,y)的值为w;

问题是,该电子设备初始状态未知,即每个位置数据未知,在一系列操作后,得到另外一种状态,问原状态是什么?

从最后开始,一步一步复原最初的情形。如果操作为 3,直接令result[x][y]=w;如果操作为 2 ,直接将该列循环下移即可(反向回推为原操作逆过程);如果操作为 1,直接将该行循环右移即可;
此题可以不用担心复杂度的问题,因为矩阵最大100 x 100,每次操作元素为100,操作次数最多1w次,故基本在100w数量级,可不必担心复杂度问题。

代码:

#include <iostream>
#include <vector>
using namespace std;

struct node {
	int type;
	int num;
	int n3;
	int n4;
	node(int type, int num, int n3 = 0, int n4 = 0) {
		this->type = type;
		this->num = num;
		this->n3 = n3;
		this->n4 = n4;
	}
};

void changeRow(vector<vector<int> >& vec, int n, int m, int row) {
	int tmp = vec[row][m];
	for (int i = m - 1; i > 0; i--) {
		vec[row][i + 1] = vec[row][i]; 
	}
	vec[row][1] = tmp;
}

void changeCol(vector<vector<int> >& vec, int n, int m, int col) {
	int tmp = vec[n][col];
	for (int i = n - 1; i > 0; i--) {
		vec[i + 1][col] = vec[i][col];
	}
	vec[1][col] = tmp;
}

int main() {
	// 题设变量n, m, q 
	int n, m, q;
	cin >> n >> m >> q;
	// 开辟数组存储n x m 矩阵  操作信息 
	vector<vector<int> > vec(n + 1, vector<int>(m + 1, 0));
	vector<node> opera;
	// 读信息 
	for (int i = 0; i < q; ++i) {
		int n1, n2, n3, n4;
		cin >> n1 >> n2;
		if (n1 != 3) {
			opera.push_back(node(n1, n2));
			continue;
		}
		cin >> n3 >> n4;
		opera.push_back(node(n1, n2, n3, n4));
	}
	// 反推回最初的结果 
	for (int i = (int)opera.size() - 1; i >= 0; --i) {
		if (opera[i].type == 1) {
			changeRow(vec, n, m, opera[i].num);
		} else if (opera[i].type == 2){
			changeCol(vec, n, m, opera[i].num);
		} else {
			vec[opera[i].num][opera[i].n3] = opera[i].n4;
		}
	}
	// 输出结果
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			cout << vec[i][j] << " ";
		}
		cout << endl;
	} 
}






 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值