contents:
mean
递推
问题边界为起点向原问题正向推导的扩展方式就是递推
递归
原问题向问题边界索要答案就是递归
怎么用
相似性结构才好递归或者递推
acwing92
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define psi pair<string, int>
#define ull unsigned ll
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
int n;
vector<int> chosen;
void calc(int x)
{
if (x == n + 1)
{
for (int i = 0; i < chosen.size(); i++)
{
printf("%d ", chosen[i]);
}
puts("");//输出字符串并且换行
return;
}
//noi
calc(x+1);//求解子问题
//yesi
chosen.push_back(x);//记录x已经被选择
calc(x+1);//求解子问题
chosen.pop_back();//准备会说到上一问题之前,还原现场
}
int main()
{
calc(1);
}
acwing 93
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define psi pair<string, int>
#define ull unsigned ll
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
int n,m;
vector<int> chosen;
void calc(int x)
{
if (chosen.size() > m || chosen.size() + (n - x + 1) < m)
return;
if (x == n + 1)
{
for (int i = 0; i < chosen.size(); i++)
{
printf("%d ", chosen[i]);
}
puts(""); //输出字符串并且换行
return;
}
//yesi
chosen.push_back(x); //记录x已经被选择
calc(x + 1); //求解子问题
chosen.pop_back(); //准备会说到上一问题之前,还原现场
//noi
calc(x + 1); //求解子问题
}
int main()
{ cin>>n>>m;
calc(1);
}
acwing94
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define psi pair<string, int>
#define ull unsigned ll
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
char g[10][10];
char backup[10][10];
int dx[5] = {0, -1, 0, 1, 0}, dy[5] = {0, 0, 1, 0, -1}; //中上右下左
void turn(int x, int y)
{ //按一下
for (int i = 0; i < 5; i++)
{
int a = x + dx[i], b = y + dy[i];
if (a >= 0 && a <= 4 && b >= 0 && b <= 4)
{
g[a][b] ^= 1;
}
}
}
void work()
{
int ans = 10000;
for (int k = 0; k < 1 << 5; k++)
{
int res = 0;
memcpy(backup, g, sizeof g);
for (int j = 0; j < 5; j++)
if (k >> j & 1)
{
turn(0, j);
res++;
}
for (int i = 0; i < 4; i++)
for (int j = 0; j < 5; j++)
if (g[i][j] == '0')
{
res++;
turn(i + 1, j);
}
bool issuccessful = true;
for (int j = 0; j < 5; j++)
if (g[4][j] == '0')
{
issuccessful = false;
break;
}
if (issuccessful)
ans = min(res, ans);
memcpy(g, backup, sizeof g);
}
if (ans > 6)
cout << -1 << endl;
else
cout << ans << endl;
return;
}
int main()
{
int t;
cin >> t;
while (t--)
{
for (int i = 0; i < 5; i++)
cin >> g[i];
work();
}
}
acwing96
f[n] = min{2*f[i],d[n-i]};
f[1]=1;
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define psi pair<string, int>
#define ull unsigned ll
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
int d[13], f[13];
int main()
{
d[1] = 1;
for (int i = 2; i <= 12; i++)
d[i] = d[i - 1] * 2 + 1;
memset(f, 0x3f, sizeof f);
f[0] = 0;
for (int i = 1; i <= 12; i++)
{
for (int j = 0; j < i; j++)
f[i] = min(f[i], f[j] * 2 + d[i - j]);
}
for (int i = 1; i <= 12; i++)
{
cout << f[i] << endl;
}
}
acwing97
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define psi pair<string, int>
#define ull unsigned ll
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
#define M 9901
const int mod = 9901;
int qmi(int a, int k)
{
a %= mod;
int res = 1;
while (k)
{
if (k & 1)
res = res * a % mod;
a = a * a % mod;
k >>= 1;
}
return res;
}
int sum(int p, int k)
{
if (k == 0)
return 1;
if (k%2==0)
return (p % mod * sum(p, k - 1)+1)%mod;
return (1 + qmi(p, k / 2 + 1)) * sum(p, k / 2) % mod;
}
int main()
{
int A, B;
cin >> A >> B;
int res = 1;
for (int i = 2; i <= A; i++)
{
int s = 0;
while (A % i == 0)
{
s++;
A /= i;
}
if (s)
res = res * sum(i, s * B) % mod;
}
if (!A)
res = 0;
cout << res << endl;
system("pause");
}
acwing98
链接: link.
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define psi pair<string,int>
#define pll pair<ll,ll>
#define ull unsigned ll
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
pll calc(ll n,ll m){
if(n==0) return {0,0};
ll len = 1ll<<n-1,cnt = 1ll<<2*n-2;// 子问题的cnt
auto pos = calc(n-1,m%cnt);
auto x = pos.first,y=pos.second;
auto z =m/cnt;
if(z==0) return {y,x};
if(z==1) return {x,y+len};
if(z==2) return {x+len,y+len};
return {2*len-y-1,len-x-1};
}
int main()
{
int t;
cin>>t;
while(t--){
ll n,a,b;
cin>>n>>a>>b;
auto ac = calc(n,a-1);
auto bc = calc(n,b-1);
double x =ac.first -bc.first,y =ac.second-bc.second;
printf("%.0lf\n",sqrt(x*x+y*y)*10);
}
return 0;
}
acwing101
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define psi pair<string, int>
#define ull unsigned ll
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
map<pii, bool> existed;
int c[N], d[N];
int main()
{
int n, p, h, m;
cin >> n >> p >> h >> m;
for (int i = 1; i <= m; i++)
{
int a, b;
cin >> a >> b;
if (a > b)
swap(a, b);
if (existed[make_pair(a, b)])
continue;
d[a+1]--,d[b-1]++;
existed[make_pair(a,b)] = true;
}
for(int i=11;i<=n;i++){
c[i] = c[i-1] + d[i];
cout<<h+c[i]<<endl;
}
}
二分的天下
[1,n]
while (l < r){ //查找>=x的数中最小的一个 [1,n+1]
int mid = (l + r) >> 1;
if (a[mid] >= x) r = mid;
else l = mid + 1;
}
return a[l];
while (l < r){ //查找<=x的数中最大的一个 a[mid]==searsh value [0,n]
int mid = (l + r + 1) >> 1;//不+1死循环
if (a[mid] <= x) l = mid;
else r = mid-1;
}
return a[l];
acwing102
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define pii pair<int, int>
#define psi pair<string, int>
#define ull unsigned ll
#define pb push_back
#define mp make_pair
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
db a[N], b[N], sum[N];
int main()
{
int n, L;
cin >> n >> L;
for (int i = 1; i <= n; i++)
cin >> a[i];
db eps = 1e-5;
db l = -1e6, r = 1e6;
while (r - l > eps)
{
double mid = (l + r) / 2;
for (int i = 1; i <= n; i++)
b[i] = a[i] - mid;
for (int i = 1; i <= n; i++)
sum[i] = (sum[i - 1] + b[i]);
db ans = -1e10;
db minval = 1e10;
for (int i = L; i <= n; i++)
{
minval = min(minval, sum[i - L]);
ans = max(ans, sum[i] - minval);
}
if (ans >= 0)
l = mid;
else
r = mid;
}
cout<<int(r*1000)<<endl;
}
acwing113
class Solution {
public:
vector<int> specialSort(int N) {
vector<int> res;
res.push_back(1);
for(int i = 2;i <= N;i++){
int l = 0,r = res.size() - 1;
while(l <= r){
int mid = l + r >> 1;
if(compare(res[mid],i)) l = mid + 1;
else r = mid - 1;
}
res.push_back(i);
for(int j = res.size() - 2;j > r;j--) swap(res[j],res[j + 1]);
}
return res;
}
};
acwing103
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 7;
struct node
{
int b, c, pos;
} person[maxn];
unordered_map<int, int> maps;
unordered_map<int, int>::iterator it;
int n, m;
int main()
{
void input();
void solve();
while (scanf("%d", &n) != EOF)
{
input();
solve();
}
return 0;
}
void input()
{
int value;
for (int i = 1; i <= n; i++)
{
cin >> value;
maps[value]++;
}
int movie,first,second;
cin>>value;
for(int i=1;i<=value;i++){
cin>>first;
person[i].b = maps[first];
person[i].pos =i;
}
for (int j = 1; j <= value; j++)
{
scanf("%d", &second);
person[j].c = maps[second];
}
return;
}
bool cmp(node a, node b)
{
return a.b == b.b ? a.c > b.c : a.b > b.b;
}
void solve()
{
sort(person + 1, person + 1 + n, cmp);
printf("%d\n", person[1].pos);
maps.clear();
return;
}