3.枚举算法(一)

一.铺地毯
https://www.luogu.com.cn/problem/P1003



1.算法原理


2.代码实现
#include <iostream>using namespace std;
const int N = 1e4 + 10;
int n;
int a[N],b[N],g[N],k[N];
int x,y;int find()
{for(int i = n;i >= 1;i--){if(a[i] <= x && b[i] <= y && a[i] + g[i] >= x && b[i] + k[i] >= y){return i;} }return -1;
}int main()
{cin >> n;for(int i = 1;i <= n; i++){cin >> a[i] >> b[i] >> g[i] >> k[i];}cin >> x >> y;cout << find() << endl;return 0;
}
二.回文日期
https://www.luogu.com.cn/problem/P2010



1.算法原理




2.代码实现
//策略三: 枚举所有的月日的组合
#include <iostream>using namespace std;int x,y;
int day[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};int main()
{cin >> x >> y;int ret = 0;for(int i = 1;i <= 12; i++){for(int j = 1;j <= day[i]; j++){int k = j % 10 * 1000 + j / 10 * 100 + i % 10 * 10 + i /10;int num = k * 10000 + i * 100 + j;if(x <= num && num <= y){ret++;}}}cout << ret << endl;return 0;
}
//策略一: 枚举所有的日期#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;int x,y;
int day[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};bool check(string s)
{int date = atoi(s.c_str());int ri = date % 100;int month = (date % 10000 - ri) / 100;int year = (date - month - ri) / 10000;// cout << year << " " << month << " " << ri << endl;if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){day[2] = 29;}else{day[2] = 28;}if(month >= 1 && month <= 12 && ri <= day[month] && ri >= 1){return true;}return false;
}int main()
{cin >> x >> y;int ret = 0;for(int i = x;i <= y; i++){string s1 = to_string(i);string s2 = s1;reverse(s1.begin(),s1.end());if(s1 == s2 && check(s1)){ret++;}}cout << ret << endl;return 0;
}
// //策略二: 枚举所有的年的组合
#include <iostream>using namespace std;int x,y;
int days[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};int main()
{cin >> x >> y;int ret = 0;for(int i = x / 10000;i <= y / 10000;i++){int day = i / 1000 + i / 100 % 10 * 10;int month = i % 10 * 10 + ((i % 100 - i % 10) / 10);if(month >= 1 && month <= 12 && day >= 1 && day <= days[month] && i * 10000 + month * 100 + day <= y){// cout << i << " " << month << " " << day << endl;ret++;}}cout << ret << endl;return 0;
}
三.扫雷
https://www.luogu.com.cn/problem/P2327


1.算法原理


2.代码实现
#include <iostream>using namespace std;const int N = 1e4 + 10;
int a[N],b[N];int n;int check1()
{a[1] = 0;for(int i = 2;i <= n+1;i++){a[i] = b[i-1] - a[i-1]-a[i-2];if(a[i]<0||a[i]>1){return 0;}}if(a[n+1] == 0){return 1;}return 0;
}int check2()
{a[1] = 1;for(int i = 2;i <= n+1;i++){a[i] = b[i-1] - a[i-1]-a[i-2];if(a[i]<0||a[i]>1){return 0;}}if(a[n+1] == 0){return 1;}return 0;
}int main()
{cin >> n;for(int i = 1;i <= n;i++){cin >> b[i];}int ret = 0;ret += check1();ret += check2();cout << ret << endl;return 0;
}
=========================================================================

四.子集
https://leetcode.cn/problems/subsets/description/

1.算法原理
![]()

2.代码实现
class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> ret;int n = nums.size();for(int st = 0;st < (1 << n);st++){vector<int> tmp;for(int i = 0;i < n ;i++){if((st >> i) & 1){tmp.push_back(nums[i]);}}ret.push_back(tmp);}return ret;}
};