#include <iostream>
using namespace std;
int pow(int a, int b)
{
int ret = 1;
if(b == 0)
return 1;
else
{
while(b--)
{
ret *= a;
}
}
return ret;
}
int main()
{
int n = 2022;
int change = 0;
for(int i = 0; i <= 3; i++)
{
int t = n % 10;
change += pow(9, i) * t;
n /= 10;
}
cout << change << endl;
return 0;
}
2.顺子日期
题目解析:这个题目手算也很快.
012 123 234 345...
因为月日的要求只能有012 和123;
那么就只要将数字全部转变为字符串,然后再找上面两个字符存不存在就可以确定了。
cpp复制代码
#include <iostream>
#include<string>
using namespace std;
bool check(int year, int month, int day)
{
string str = to_string(year);
if(month < 10)
str += '0';
str += to_string(month);
if(day < 10)
str += '0';
str += to_string(day);
return (str.find("012") != -1 || str.find("123") != -1);
}
int main()
{
int year = 2022;
int ans = 0;
int Month[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
for(int month = 1; month <= 12; month++)
{
for(int day = 1; day <= Month[month]; day++)
{
if(check(year, month, day))
{
ans++;
}
}
}
cout << ans << endl;
return 0;
}
3.刷题统计
题目解析:题目比较简单,就是加和加上判断。最后返回日期即可。
cpp复制代码
#include <iostream>
using namespace std;
int main()
{
long long a, b, n;
cin >> a >> b >> n;
long long sum = 0;
long long day = 0;
while(1)
{
if(sum >= n)
{
cout << day << endl;
return 0;
}
for(int i = 1; i <= 7; i++)
{
if(sum >= n)
{
cout << day << endl;
return 0;
}
if(i >= 1 && i <= 5)
{
sum += a;
}
else
{
sum += b;
}
day++;
}
}
return 0;
}
后面想了一下只过了6个用例,那么就是数据肯定太大,处理出错了.
cpp复制代码
#include <iostream>
using namespace std;
int main()
{
long long a, b, n;
cin >> a >> b >> n;
long long week = a * 5 + b * 2;//一周做题量
long long num = (n / week) * week;//花费周数的做题量;
long long day = (n / week) * 7;//花费天数.
while(n - num > 0)
{
if(day % 7 < 5)
num += a;
else
num += b;
day++;
}
cout << day << endl;
return 0;
}
4.修剪灌木
题目解析:这个题目;自己可以写几个看看规律。
每次剪树的移动时间就会给树的生长提供时间间隙;
那么就可以分三种情况:
1.从左到右边进行剪第一次,那么就是从开始剪的地方到现在剪的地方的天数就是可以长高的高度就是i。
2.从左到右边再从右边拐到左边剪,那么就是 i, i + 1, i + 2, ..., n, n -1 , n - 2, ...., i;
那么生长高度就是2*(n - i);
3.从右边到左边再拐到右边剪,那么就是 i - 1, i -2, i -3 ..., 1, 2, ..., i;
那么生长的高度就是2(i - 1);
cpp复制代码
#include <iostream>
using namespace std;
int maxtreelenth(int a, int b, int c)
{
if(a > b)
{
if(a > c)
return a;
else
return c;
}
else
{
if(c > b)
return c;
else
return b;
}
}
int main()
{
int n, i;
cin >> n;
for(int i = 1; i <= n; i++)
{
cout << maxtreelenth(i, 2 * (n - i), 2 * (i - 1)) << endl;
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10,MOD = 1e9 + 7;
int n,m1,m2,m;
int a[N],b[N];
int main(){
cin >> n >> m1;
for(int i = m1 - 1;i >= 0;i --) cin >> a[i];
cin >> m2;
for(int i = m2 - 1;i >= 0;i --) cin >> b[i];
int m = max(m1,m2);
int res = 0;
for(int i = m;i >= 0;i --){
res = (res * (long long)(max({2,a[i] + 1,b[i] + 1})) + a[i] - b[i]) % MOD;
}
cout << res << endl;
return 0;
}
6.统计子矩阵
题目解析:
6.统计子矩阵:
题目解析:前缀和+双指针,将原矩阵加和得到sum矩阵,然后使用双指针进行矩阵的值判断.
例子:
3 4 10
1 2 3 4
5 6 7 8
9 10 11 12
sum矩阵:
1 2 3 4
6 8 10 12
15 18 21 24
使用双指针 L 和R 进行遍历矩阵范围的控制.最好自己画一下图更好理解上手,然后去写代码
cpp复制代码
#include<iostream>
using namespace std;
#define maxn 505
int a[maxn][maxn];
int sum[maxn][maxn];
int main()
{
int n, m, k;
cin >> n >> m >> k;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
cin >> a[i][j];
sum[i][j] = a[i][j] + sum[i - 1][j];
}
}
long long m_cout = 0;
for(int x = 1; x <= n; x++)
{
for(int y = x; y <= n; y++)
{
for(int r = 1, l = 1, s = 0; r <= m; r++)
{
s += sum[y][r] - sum[x - 1][r];
while(s > k && l < r)
{
s = s - sum[y][l] + sum[x - 1][l];
l++;
}
if(s <= k)
{
m_cout += r - l + 1;
}
}
}
}
cout << m_cout << endl;
return 0;
}