九进制转十进制
答案:1478
顺子日期
枚举就行了
答案:14
刷题统计
统计整周后在细化
typedef long long ll;
ll a, b, n, k;
ll ans = 0;
int main() {
cin >> a >> b >> n;
k = a * 5 + b + b;
ans += n / k * 7;
n %= k;
if (n <= a * 5) {
ans += n / a + (n % a != 0);
}
else {
n -= a * 5;
ans += 6 + (n > b);
}
cout << ans << endl;
return 0;
}
修建灌木
有两种情况:1从开始到该树2从被修剪过到下一次
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)cout<<2*max(n-i,i-1)<<endl;
}
X进制减法
typedef long long ll;
const ll MOD = 1000000007;
const int MAXM = 100005;
int n, ma, mb;
int a[MAXM], b[MAXM];
ll ans = 0, bac = 1;
int main() {
cin >> n;
cin >> ma;
for (int i = 1; i <= ma; i++) {
cin >> a[i];
}
cin >> mb;
for (int i = 1; i <= mb; i++) {
cin >> b[i];
}
int i = ma, j = mb;
while (i > 0) {
ans += (a[i] - b[j]) * bac;
ans %= MOD;
ll p = max(a[i], b[j]) + 1;
bac *= max(p, 2LL);
bac %= MOD;
i--;
if (j) j--;
}
cout << ans << endl;
return 0;
}
统计子矩阵
主要使用前缀和
typedef long long ll;
const int N = 5e2+3;
int n, m, k;
int a[N][N];
int main(){
ios::sync_with_stdio(false);
cin >> n >> m >> k;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
cin >> a[i][j];
a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
}
}
ll ans = 0;
for(int i=1; i<=m; i++){
for(int j=i; j<=m; j++){
for(int s = 1, t = 1; t <= n; t ++ ){
while(s <= t && a[t][j] - a[s - 1][j] - a[t][i - 1] + a[s - 1][i - 1] > k) s ++ ;
if(s <= t) ans += t - s + 1;
}
}
}
cout << ans << '\n';
}
积木画
主要考虑状态转移
//const int N = 1e7 + 1;
//int a[N][4],b,c[4][4] = { 1,1,1,1,0,0,1,1,0,1,0,1,1,0,0,0};
//int main()
//{
// cin >> b;
// a[1][0] = 1;
// for (int i = 1; i <= b; i++)
// for (int j = 0; j < 4; j++)
// for (int k = 0; k < 4; k++)
// a[i + 1][k] = (a[i + 1][k] + a[i][j] * c[j][k]) % 1000000007;
// cout << a[b+1][0];
//}
扫雷
#define ll long long
const int N = 5e4 + 10;
const int M = 1e7;
struct node
{
int x, y, r, nu;
bool operator <(const node &t) const
{
if(x != t.x)
return x < t.x;
return y < t.y;
}
}a[N];
int ans = 0;
int n, m;
int n1;
map<pair<int, int>, int> mp;
int h[N], ne[M], e[M], cnt;
int vis[N];
int num[N];
void add(int x, int y)
{
e[cnt] = y, ne[cnt] = h[x], h[x] = cnt ++;
}
void dfs2(int x)
{
vis[x] = 1;
ans += a[x].nu;
for(int i = h[x]; ~i; i = ne[i])
{
int v = e[i];
if(vis[v] == 1) continue;
dfs2(v);
}
}
void dfs(int x, int y, int z)
{
node e = {x - z - 1, y, z};
node e1 = {x + z + 1, y, z};
int l = lower_bound(a + 1, a + n1 + 1, e) - a;
int r = lower_bound(a + 1, a + n1 + 1, e1) - a;
l = min(n1, l);
r = min(n1, r);//找到对应可能炸到的最远的炸弹
for(int i = l; i <= r; i ++)
{
int tmp = abs(a[i].x - x) * abs(a[i].x - x) + abs(a[i].y - y) * abs(a[i].y - y) - z * z;
if(tmp <= 0 && vis[i] == 0)
{
dfs2(i); // 引爆
}
}
}
int main()
{
ios::sync_with_stdio(0);
memset(h, -1, sizeof h);
cin >> n >> m;
for(int i = 1; i <= n; i ++)
{
int x, y, z;
cin >> x >> y >> z;
int tt = mp[{x, y}]; //数据去重,保证每个坐标唯一
if(tt != 0)
{
a[tt].r = max(a[tt].r, z);
a[tt].nu ++;
}
else
{
a[++n1].x = x;
a[n1].nu = 1;
a[n1].y = y;
a[n1].r = z;
mp[{x, y}] = n1;
}
}
mp.clear();
sort(a + 1, a + n1 + 1);
for(int i = 1; i <= n1; i ++) // 建图
{
mp[{a[i].x, a[i].y}] = i;
int dis = a[i].r * a[i].r;
for(int j = i - 1; j >= 1; j --)
{
int tmp1 = abs(a[i].x - a[j].x) * abs(a[i].x - a[j].x);
if(tmp1 > dis) break;
int tmp = abs(a[i].x - a[j].x) * abs(a[i].x - a[j].x) + abs(a[i].y - a[j].y) * abs(a[i].y - a[j].y);
if(tmp <= a[i].r * a[i].r)
{
add(i, j);
}
}
for(int j = i + 1; j <= n1; j ++)
{
int tmp1 = abs(a[i].x - a[j].x)* abs(a[i].x - a[j].x);
if(tmp1 > dis) break;
int tmp = abs(a[i].x - a[j].x)* abs(a[i].x - a[j].x) + abs(a[i].y - a[j].y) * abs(a[i].y - a[j].y);
if(tmp <= a[i].r * a[i].r)
{
add(i, j);
}
}
}
for(int i = 1; i <= m; i++)
{
int x, y, z;
cin >> x >> y >> z;
dfs(x, y, z);
}
cout << ans << endl;
return 0;
}
李白打酒加强版
const int N = 110, M = 1000000007;
int n, m, f[N][N][N];
int main()
{
scanf("%d%d", &m, &n);
for(int i = 0; i <= n; i ++ )
{
for(int j = 0; j <= m; j ++ )
{
for(int k = 0; k < N; k ++ )
{
if(i == 0 && j == 0 && k == 2)
f[i][j][k] = 1;
if(i == 0 && j == 0)
continue;
if(i > 0)
f[i][j][k] = (f[i][j][k] + f[i - 1][j][k + 1]) % M;
if(j > 0 && k % 2 == 0)
f[i][j][k] = (f[i][j][k] + f[i][j - 1][k / 2]) % M;
}
}
}
printf("%d", f[n - 1][m][1]);
return 0;
}
砍竹子
这题比较难,从acw题解借鉴来的
typedef long long LL;
const int N = 2e5 + 10;
LL a[N];
vector<LL> b[N];
int n;
LL solve(LL x) {
return sqrt(x / 2 + 1);
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++ ) scanf("%lld", &a[i]);
int res = 0;
for(int i = 1; i <= n; i ++ ) {
while(a[i] > 1) {
int flag = 0;
for(LL j : b[i - 1]) {
if(a[i] == j) {
flag = 1;
break;
}
}
if(!flag) res ++;
b[i].push_back(a[i]);
a[i] = solve(a[i]);
}
}
printf("%d", res);
return 0;
}