202203-2出行计划
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
//202203-2 出行计划
const int N = 2e5+10;
int cnt[N];
int main()
{
//输出q能含于的区间数
//不断地对区间所包含的数+1,用差分可以降低时间复杂度
int n,m,k,q;
cin >> n >> m >> k;
for(int i=0;i<n;i++)
{
int t,c;
cin >> t >> c;
//边界问题
int x = t-k-c+1; //左
x = max(1, x); //下界不能小于1
int y = t-k; //右
if(y<1) continue;
cnt[x]++;
cnt[y+1]--;
}
//计算前缀和
cnt[0] = 0;
for(int i=1;i<=200000;i++) cnt[i] += cnt[i-1];
while(m--)
{
cin >> q;
printf("%d\n",cnt[q]);
}
return 0;
}
202209-1 如此编码
#include<bits/stdc++.h>
using namespace std;
const int N = 21;
int c_Arr[N];
stack<int> b_Arr;
int main()
{
c_Arr[0] = 1;
int n,m;
cin >> n >> m;
for(int i=1;i<=n;i++)
{
cin >> c_Arr[i];
c_Arr[i] = c_Arr[i]*c_Arr[i-1];
}
for(int i=n;i>=1;i--)
{
int b;
b = (m%c_Arr[i] - m%c_Arr[i-1])/c_Arr[i-1];
b_Arr.push(b);
}
while(!b_Arr.empty())
{
cout << b_Arr.top() << " " ;
b_Arr.pop();
}
return 0;
}
20220902c 何以包邮
#include <bits/stdc++.h>
using namespace std;
const int N = 31;
int book[N];
int sum_book[N];
int res;
int n,x;
void dfs(int id, int fee)
{
if(fee + sum_book[n] - sum_book[id] < x) return;
// 剪枝--如果当前的选择基本都是不选,那么后面的就算全选也不够包邮就剪掉,随着x取值不同,减去的规模也不一样
if(id == n)
{
if(fee >= x)
res = min(res, fee);
return;
}
dfs(id+1, fee+book[id]); //选择当下这本书
dfs(id+1, fee);
return;
}
int main()
{
int fee;
cin >> n >> x;
sum_book[0] = 0;
for(int i=0;i<n;i++)
{
cin >> book[i];
res += book[i];
sum_book[i+1] = sum_book[i] + book[i];
}
dfs(0, 0);
printf("%d", res);
return 0;
}