数学
数学题一般应用某种定理或公式,这是我们要尽力去分析–用数学归纳法找出其中规律。对于一些简单数字可以采用打表计数得出一些序列观察其中存在的规律
// 演算
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int m, n; //表示每种包装中糖的数量
bool dfs(int m, int p, int q)
{
if(!m) return true; // m 为0 --true 表示递归过程中 m 被全部分解为<p, q> 倍数的糖果数量
// 放缩-- m 递归递减 p, q 倍数直到 当递减到 m(min) < p q,说明m无法被分解<p,q> 倍数
if(m >= p && dfs(m - p, p, q)) return true;
if(m >= q && dfs(m - q, p, q)) return true;
return false;
}
int main()
{
cin >> n >> m;
int res = 0; // 记录最大不能买到的糖数
// 从 1 ~ 1000 暴力枚举出 <p, q> 不能买到的最大糖果数
// 这里只是简单演算一些数值规律
for(int i = 1; i <= 1000; i ++ )
{
if(!dfs(i, m, n)) res = i; // dfs判断 i 是否满足最大不能按<p, q> 买到的数
}
cout << res << endl;
return 0;
}
/*
m n 最大不能÷<p,q>数
3 7 11
3 8 13
tmd超时了……
*/
#include <iostream>
using namespace std;
int main()
{
int m, n;
cin >> m >> n;
int k = m * n; // 最大不能整除 <m, n> 的数一定 < m * n
while(k--)
{
int t = k; // t 存放判断前的 k
// 判断 k 不能组成 k = x * m + y * n 形式
while(t % m != 0 && t - n >0) t -= n; // k 在不能被 m 单除基础上 减去 n 倍数到最小值,即 k 无法被 n 单除
if(t % m != 0 && k % n !=0 && k % m != 0 ) // 上述两个条件再判断一下
{
printf("%d\n", k);
break;
}
}
}
1211.蚂蚁感冒
分析
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int n;
int x[N];
int main()
{
cin >> n;
for(int i = 0; i < n; i ++ ) cin >> x[i];
int left = 0, right = 0; // 分别表示左边向右走的蚂蚁数量和右边向左走的蚂蚁数量
for(int i = 0; i < n; i ++ )
{
if(abs(x[i]) < abs(x[0]) && x[i] > 0) left ++