顺子日期
#include<bits/stdc++.h>
using namespace std;
int main()
{
cout << "14";
return 0;
}
九进制转十进制
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void slove()
{
int n=2022,ans=0,t=1;
while(n)
{
ans+=n%10*t;
n/=10;
t*=9;
}
cout<<ans;
}
int main()
{
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
刷题统计
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
LL a, b, n;
cin >> a >> b >> n;
LL sum = a * 5 + b * 2;
// cout << sum << endl;
LL x = (LL)(n / sum);
LL ans = (LL)(x * 7);
sum = n - x * sum;
LL num = 0;
// cout << ans << " " << sum << endl;
for (int i = 1; i <= 7; i ++)
{
if (num >= sum) break;
ans ++;
if (i >= 6) num += b;
else num += a;
// cout << ans << " " << num << endl;
// if (num >= sum) break;
}
cout << ans << endl;
return 0;
}
修剪灌木
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++)
{
cout << max((n - i) * 2, (i - 1) * 2) << endl;
}
return 0;
}
X进制减法
// #include <iostream>
// #include <cstring>
// #include <algorithm>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 1000000007;
const int N = 1e5 + 20;
int x, n1, n2;
LL a[N], b[N], c[N], w[N];
int main()
{
cin >> x;
cin >> n1;
LL sum1 = 0;
for (int i = n1 - 1; i >= 0; i --)
{
cin >> a[i];
}
cin >> n2;
for (int i = n2 - 1; i >= 0; i --)
{
cin >> b[i];
}
for (int i = 0; i < max(n1, n2); i ++)
{
c[i] = max(a[i] + 1, b[i] + 1);
if (c[i] < 2) c[i] = 2;
if (c[i] > x) c[i] = x;
}
w[0] = 1;
for (int i = 1; i < max(n1, n2); i ++)
{
w[i] = w[i - 1] * c[i - 1] % mod;
}
LL cnt = 1;
for (int i = n1 - 1; i >= 0; i --)
{
sum1 = (LL)(sum1 + (LL)(a[i]) * w[i] ) % mod;
}
LL sum2 = 0;
for (int i = n2 - 1; i >= 0; i -- )
{
sum2 = (LL)(sum2 + (LL)(b[i]) * w[i] ) % mod;
}
cout << (LL)((sum1 - sum2 + mod) % mod) << endl;
return 0;
}
统计子矩阵
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 550;
int g[N][N];
int n, m, k;
int main()
{
cin >> n >> m >> k;
for (int i = 1; i <= n; i ++)
{
for (int j = 1; j <= m; j ++)
{
cin >> g[i][j];
g[i][j] += g[i - 1][j];
}
}
LL ans = 0;
for (int i = 1; i <= n; i ++)
{
for (int j = i; j <= n; j ++)
{
for (int l = 1, r = 1, sum = 0; r <= m; r ++)
{
sum += g[j][r] - g[i - 1][r];
while (sum > k)
{
sum -= g[j][l] - g[i - 1][l];
l ++;
}
ans += r - l + 1;
}
}
}
cout << ans << endl;
return 0;
}
积木画
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod = 1000000007;
const int N = 1e7 + 10;
int n;
int f[2][4]; // 滚动数组
int g[4][4] = {
{1, 1, 1, 1},
{0, 0, 1, 1},
{0, 1, 0, 1},
{1, 0, 0, 0},
};
int main()
{
cin >> n;
f[1][0] = 1;
for (int i = 1; i <= n; i ++)
{
memset(f[i + 1 & 1], 0, sizeof f[i + 1 & 1]);
for (int j = 0; j < 4; j ++)
{
for (int k = 0; k < 4; k ++)
{
if (g[j][k])
f[i + 1 & 1][k] = (f[i + 1 & 1][k] + f[i & 1][j]) % mod;
}
}
}
cout << f[n + 1 & 1][0] % mod << endl;
return 0;
}
李白打酒加强版
思路:
如果最后一步是到店,那么j应该大于0,因为至少有最后一步到店,到花同理,
如果最后一步是到店,那么上一步手里有的酒应该是k / 2,也是因此我们的k应该整除于2
如果最后一步是到花,那么上一步手里有的酒应该是k + 1。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 120, mod = 1000000007;
int n, m;
int f[N][N][N];
int main()
{
cin >> n >> m;
f[0][0][2] = 1;
for (int i = 0; i <= n; i ++)
{
for (int j = 0; j <= m; j ++)
{
for (int k = 0; k <= m; k ++)
{
int &v = f[i][j][k];
if (i && k % 2 == 0) v = (v + f[i - 1][j][k/2]) % mod;
if (j) v = (v + f[i][j - 1][k + 1]) % mod;
}
}
}
cout << f[n][m - 1][1] << endl;
return 0;
}
砍竹子
思路:
这个题本质是一个最长公共下降子序列的问题,对于任意一个h,只要它高度降到了与前一个高度下降过程中的公共值,那么它就不需要花费代价继续下降。如果它降得的当前高度与前一个高度没有公共值,则需要多花费一个代价,来降低自己的高度。我们只需要开两个数组暴力做一下就行。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = 2e5 + 20;
int n, m;
LL f[N][20];
int main()
{
cin >> n;
LL st[N];
LL res = 0;
for (int i = 1; i <= n; i ++)
{
LL x;
cin >> x;
int top = 0;
while (x > 1) st[++ top] = x, x = sqrt(x/2 + 1);
res += top;
m = max(m, top);
for (int j = 0, k = top; k >= 1; k --, j ++)
{
f[i][j] = st[k];
}
}
for (int i = 0; i < m; i ++)
{
for (int j = 2; j <= n; j ++)
{
if (f[j][i] == f[j - 1][i] && f[j][i]) res --;
}
}
cout << res << endl;
return 0;
}