P1085 [NOIP 2004 普及组] 不高兴的津津

记录21

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int day = 1;
	bool UnHappy = 0;
	int max=-1;
	int a,b,t;
	while (day <= 7) {
		cin >> a >> b;
		if(a+b>8) UnHappy=1;
    if(a+b>max){
      max=a+b;
      t=day;
    } 
		day++;
	}
	if(UnHappy) cout<<t;
  else cout<<0;
	return 0;
}

突破口

津津如果一天上课超过八个小时就会不高兴

如果不会不高兴则输出 0,输出最不高兴的是周几(用 1,2,3,4,5,6,7 分别表示周一,周二,周三,周四,周五,周六,周日)

思路

简单的枚举,周一到周日遍历一遍,遍历的过程中记录有不高兴情况,同时记录下最大时间。没有就输出0

代码简析

	int day = 1;
	bool UnHappy = 0;
	int max=-1;
	int a,b,t;

day从第一天开始记录,UnHappy记录不开心情况,max记录最大值(设置为-1,这样第一天的时间开始比较),a,b输入的数据,t记录最不开心的那一天是周几

	while (day <= 7) {
		cin >> a >> b;
		if(a+b>8) UnHappy=1;
    if(a+b>max){
      max=a+b;
      t=day;
    } 
		day++;
	}

if(a+b>8) UnHappy=1;有不高兴情况先打开开关

if(a+b>max)记录最大不开心时间与周几

补充

枚举算法的使用场景、注意要点与技巧

1. 枚举算法概述

  • 定义:枚举算法是一种通过遍历所有可能的解来找到问题答案的算法。它是一种简单的暴力搜索方法,适用于解空间较小的问题。

  • 特点

    • 简单直观:逻辑简单,易于理解和实现。

    • 适用范围广:适用于各种类型的问题,尤其是解空间较小的问题。

    • 效率较低:对于解空间较大的问题,效率较低,可能导致超时。

2. 枚举算法的使用场景

2.1 解空间较小
  • 定义:当问题的解空间较小,即所有可能的解的数量不多时,可以使用枚举算法。

  • 示例

    • 数字问题:如找出1到100之间的所有质数。

    • 组合问题:如从5个物品中选择3个的所有组合。

2.2 问题规模较小
  • 定义:当问题的规模较小,即输入数据的范围较小时,可以使用枚举算法。

  • 示例

    • 字符串问题:如找出长度为5的字符串的所有子串。

    • 数组问题:如找出一个长度为10的数组的所有子数组。

2.3 无明显规律
  • 定义:当问题没有明显的规律或公式可以求解时,可以使用枚举算法。

  • 示例

    • 排列问题:如找出1到5的所有排列。

    • 组合问题:如找出1到5的所有组合。

3. 枚举算法的注意要点

3.1 明确解空间
  • 定义:在开始枚举之前,必须明确问题的解空间,即所有可能的解的集合。

  • 示例

    • 数字问题:找出1到100之间的所有质数,解空间是1到100的所有整数。

    • 字符串问题:找出长度为5的字符串的所有子串,解空间是所有可能的子串。

3.2 避免重复
  • 定义:在枚举过程中,避免重复枚举相同的解,以提高效率。

  • 示例

    • 组合问题:从5个物品中选择3个的所有组合,避免重复选择相同的3个物品。

3.3 优化剪枝
  • 定义:在枚举过程中,通过剪枝技术跳过不可能的解,以提高效率。

  • 示例

    • 数字问题:找出1到100之间的所有质数,跳过所有偶数(除了2)。

3.4 边界检查
  • 定义:在枚举过程中,进行边界检查,确保枚举的解在有效范围内。

  • 示例

    • 数组问题:找出一个长度为10的数组的所有子数组,确保子数组的索引在数组范围内。

4. 枚举算法的技巧

4.1 顺序枚举
  • 定义:按照一定的顺序(如从小到大)枚举所有可能的解,以避免重复。

  • 示例

    • 数字问题:找出1到100之间的所有质数,从小到大枚举每个数字。

    • 字符串问题:找出长度为5的字符串的所有子串,按子串的起始位置从小到大枚举。

4.2 多重循环
  • 定义:使用多重循环枚举多个变量的所有可能组合,适用于多维问题。

  • 示例

    • 组合问题:从5个物品中选择3个的所有组合,使用三重循环枚举所有可能的组合。

4.3 递归枚举
  • 定义:使用递归方法枚举所有可能的解,适用于复杂问题。

  • 示例

    • 排列问题:找出1到5的所有排列,使用递归方法枚举所有可能的排列。

4.4 优化剪枝
  • 定义:在枚举过程中,通过剪枝技术跳过不可能的解,以提高效率。

  • 示例

    • 数字问题:找出1到100之间的所有质数,跳过所有偶数(除了2)。

    • 组合问题:从5个物品中选择3个的所有组合,跳过重复的组合。

4.5 数据结构优化
  • 定义:使用合适的数据结构来存储和操作数据,以提高枚举的效率。

  • 示例

    • 数组问题:找出一个长度为10的数组的所有子数组,使用数组存储子数组的和。

    • 字符串问题:找出长度为5的字符串的所有子串,使用字符串数组存储子串。

5. 实例分析

5.1 找出1到100之间的所有质数
  • 问题描述:找出1到100之间的所有质数。

  • 注意要点

    • 明确解空间:解空间是1到100的所有整数。

    • 避免重复:每个数字只检查一次。

    • 优化剪枝:跳过所有偶数(除了2)。

    • 边界检查:确保检查的数字在1到100之间。

  • 技巧应用

    • 顺序枚举:从小到大枚举每个数字。

    • 优化剪枝:跳过所有偶数(除了2)。

    • 数据结构优化:使用布尔数组标记每个数字是否为质数。

5.2 从5个物品中选择3个的所有组合
  • 问题描述:从5个物品中选择3个的所有组合。

  • 注意要点

    • 明确解空间:解空间是从5个物品中选择3个的所有可能组合。

    • 避免重复:每个组合只枚举一次。

    • 优化剪枝:跳过重复的组合。

    • 边界检查:确保选择的物品索引在范围内。

  • 技巧应用

    • 多重循环:使用三重循环枚举所有可能的组合。

    • 优化剪枝:跳过重复的组合。

    • 数据结构优化:使用数组存储组合结果。

6. 总结

枚举算法是一种通过遍历所有可能的解来找到问题答案的算法,适用于解空间较小、问题规模较小或无明显规律的问题。在实现枚举算法时,需要注意以下要点:

  • 明确解空间:明确问题的解空间,即所有可能的解的集合。

  • 避免重复:在枚举过程中,避免重复枚举相同的解。

  • 优化剪枝:通过剪枝技术跳过不可能的解,以提高效率。

  • 边界检查:在枚举过程中,进行边界检查,确保枚举的解在有效范围内。

同时,可以应用以下技巧来提高枚举算法的效率和正确性:

  • 顺序枚举:按照一定的顺序枚举所有可能的解。

  • 多重循环:使用多重循环枚举多个变量的所有可能组合。

  • 递归枚举:使用递归方法枚举所有可能的解。

  • 优化剪枝:通过剪枝技术跳过不可能的解。

  • 数据结构优化:使用合适的数据结构来存储和操作数据。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值