第一次csp模拟赛B

题意:
一个人连续n天去买东西,给出n个数据,为之后n天每天要买的东西的数量,如果能按照这个数据购买,则成功,输出“YES",不能按照给定的数据购买,则输出”NO“。店家有两种购买方式,一:一次性购买两个。 二:今天买一个,送一张券留着明天用。(明天手里的券必须用完,如有剩余则失败)。其中两种方式每天都可以购买无数次。


思路:
根据每天要求的购买数量a,肯定是先尽可能用第一种方式购买,这样手里的券ret最少,即之后能成功购买的可能性更高。即对a进行除2取余,如果得到的是1,则将该值赋给a。如果得到的是0,则将2赋给a(防止手里有券没有使用而全使用方法一导致失败)。经过上面的处理,手里的券最多为一张。之后进入循环判断,分为两种大情况,一:有一张券,则对a进行判断,如果a是0,则失败,循环结束。如果a是1,则刚好用券购买,ret置为0。如果是2,则再用方式2购买,ret仍然是1。 二:手里没有券,此时如果a为0或者2,则直接进入下一轮循环。若a为1,则ret置为1.进入下一轮。在循环结束后对ret进行判断。若ret不为0,则购买失败,否则购买成功。


总结:
这一题的审题很重要,比如一二种方式每次可以购买无数次,第二天如果仍有剩余的券没有用完则购买失败。每天要求购买的数量没有确定,不是题目给定的两个例子中的只有0,1,2.

代码:

#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;


int main(){
	int n;
	cin>>n;
	int ret=0;
	int a;
	for(int i=0;i<n;i++){
		scanf("%d",&a);
		if(a!=0){
			a=a%2;
			if(a==0) a=2;
		}
		if(ret==1){  //有券 
			if(a==2) continue;
			if(a==1){
				ret=0;
				continue;
			}
			if(a==0) break;
		}
				
		if(ret==0){ //没有券
			if(a==2) continue;
			if(a==1){
				ret=1;
				continue;
			}
			if(a==0) continue;	
		}	
	}
	if(ret==0){
		cout<<"YES"<<endl;
	}else{
		cout<<"NO"<<endl;
	}
	
	
	return 0;
}
以下是一套模拟CSP-S(计算机软件能力认证赛)的高难度试题,题目设计参考了正规CSP-S考试模式,包括题目类型、评分标准和解题思路。 ### 试题一:最长不降子序列的个数 给定一个整数数组`nums`,返回它的最长不降子序列的个数。例如,数组`[1,3,5,4,7]`的最长不降子序列是`[1,3,4,7]`和`[1,3,5,7]`,因此答案为2。 **输入格式:** 第一行输入一个整数`n`表示数组长度; 第二行输入`n`个整数表示数组内容。 **输出格式:** 输出最长不降子序列的个数。 **样例输入:** ``` 5 1 3 5 4 7 ``` **样例输出:** ``` 2 ``` **提示:** - 时间复杂度应控制在$O(n^2)$以内。 - 空间复杂度应优化至$O(n)$。 --- ### 试题二:树的直径 给定一棵无向树,求出它的直径长度。树的直径定义为任意两个节点之间最长路径的长度。 **输入格式:** 第一行输入一个整数`n`表示节点数量; 接下来`n-1`行输入每条边的信息,每行输入两个整数`u`和`v`表示节点`u`和`v`之间有一条边。 **输出格式:** 输出树的直径长度。 **样例输入:** ``` 6 1 2 2 3 2 4 4 5 5 6 ``` **样例输出:** ``` 3 ``` **提示:** - 可使用两次BFS或DFS解决。 - 第一次从任意节点出发找到最远节点,第二次从该节点出发找到最远距离即为直径。 --- ### 试题三:最小生成树 给定一个带权无向图,求出它的最小生成树(MST)的总权重。图的边权可能为负数。 **输入格式:** 第一行输入两个整数`n`和`m`表示节点数量和边数量; 接下来`m`行输入每条边的信息,每行输入三个整数`u`、`v`和`w`表示节点`u`和`v`之间有一条权重为`w`的边。 **输出格式:** 输出最小生成树的总权重。 **样例输入:** ``` 4 5 1 2 10 1 3 6 1 4 5 2 3 15 3 4 4 ``` **样例输出:** ``` 15 ``` **提示:** - 使用Kruskal算法或Prim算法解决。 - 注意处理重边和负权边的情况。 --- ### 试题四:字符串的最长回文子串 给定一个字符串`s`,返回它的最长回文子串。回文子串是指正读和反读都一样的子串。 **输入格式:** 输入一个字符串`s`。 **输出格式:** 输出最长回文子串。 **样例输入:** ``` "babad" ``` **样例输出:** ``` "bab" ``` **提示:** - 使用中心扩展法或动态规划法解决。 - 动态规划法的时间复杂度为$O(n^2)$,空间复杂度为$O(n^2)$。 --- ### 试题五:矩阵中的路径 给定一个`m x n`的网格和一个字符串`s`,判断该网格中是否存在一条路径,路径上的字符连接起来恰好等于`s`。路径可以从任意位置开始,但每次只能向上下左右四个方向移动,且同一个格子不能重复使用。 **输入格式:** 第一行输入两个整数`m`和`n`表示网格大小; 接下来`m`行输入每行`n`个字符表示网格; 最后一行输入一个字符串`s`。 **输出格式:** 输出是否存在这样的路径。 **样例输入:** ``` 3 4 A B C E S F C S A D E E ABCCED ``` **样例输出:** ``` true ``` **提示:** - 使用DFS(深度优先搜索)结合回溯算法解决。 - 注意剪枝优化,减少不必要的搜索。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值