92. 递归实现指数型枚举 – AcWing题库
#include
using namespace std;
const int N=17;
int n;
bool vis[N];//记录某一个数是否出现过
void dfs(int dep){
// if(vis[dep])continue;//没有这一句 因为一定不会有已经选过的数
if(dep==n+1){
for(int i=1;i>n;
dfs(1);
return 0;
}
//输入3 输出 1 12 123 2 23 3 特点:长度不固定 不会往前找
94. 递归实现排列型枚举 – AcWing题库
#include
using namespace std;
const int N=17;
int n;
bool vis[N]={};//记录某一个数是否出现过
vectorans;
void dfs(int dep){//这里的dep表示的是够多少个数
if(dep==n+1){
for(auto i:ans)cout>n;
dfs(1);
return 0;
}
//输入3 输出123 132 213 231 321 312 特点长度固定,可以往前找
93. 递归实现组合型枚举 – AcWing题库
#include
using namespace std;
const int N=100;
int a[N];
int n,m;//n个数中选择m个
int vis[N];
void dfs(int dep,int st){//st数组是为了保证顺序每次只往后面找
if(dep==m+1){//选够m个数了 该选第m+1个数了
for(int i=1;i>n>>m;
for(int i=1;i
dfs与for循环结合 长度固定 可以往前找 (可以用st限制)
dfs不与for循环结合 长度不固定 不能往前找
95. 费解的开关 – AcWing题库
#include
using namespace std;
const int N = 6;
int xx[N] = {-1, 0, 1, 0, 0};//上 右 下 左 中
int yy[N] = {0, 1, 0, -1, 0};
char g[N][N], backup[N][N];
// 这个操作是把(x, y)以及上下左右的灯都变成相反的颜色
void turn (int x, int y){
for (int i = 0; i = 5 || b = 5) continue;
g[a][b] ^= 1; //异或,不同的时候就变成相反的数
//同0异1
}
}
int main(){
int n;scanf("%d", &n);
while(n -- ){
// 按行输入,把每一行当成一个字符串
for (int i = 0; i > g[i];
int res = 0x3f3f;
// 这里我们枚举了第一行的32种按法,不用管是亮是灭,把第一行所有情况都按一遍
// 按每种情况的第一行,去遍历接下来的行
// 枚举32种第一行的按法只是可能会减少步数,如果直接从第二行开始答案一定是固定的了,找不到最优解或者可能没有解
//枚举第一行的意义是:不需要在意第一行的灯是灭是暗,只需把第一行的按法枚举一遍,也就是我们说的 “操作”,
//每个位置都有两种选择,按(用1表示)或者不按(用0表示),遍历这32种操作引发的情况,
//每一次再通过res = min(res, step);把最小步数存一下,就能找到最优解
for (int op = 0; op > i & 1) // 数字2 对应了 00010 表示第2个位置的按一下
// 00010 >> 1 & 1 是1 所以turn(0, 1) 就是第一行第二个位置
{ // 数字3 对应了00011 表示第1 和第2个位置的按一下
step ++ ;
turn (0, i);//使得第一行的形式改变 一定有一种 正好按住原状态中的暗灯
}
// 然后通过第一行按完之后的状态,按234行
for (int i =0; i 6) res = -1;
cout
重点:
1.为什么五个位置是2^4却枚举到32 因为最差的情况是00000是0 最好的情况是11111是31 所以要到32
2.位运算中 ^1相当于取反 同0异1
3.把第一行的所有按法都枚举一遍 一定有一种是刚好与第一行的情况向对应的 不断更新答案即可
4,如果最后一行还有暗的话说明没救了
5.memcpy(a,b,sizeof b)是复制数组的用法
116. 飞行员兄弟 – AcWing题库
//一个把手改变,会使所在行列的所有把手全部反转
//特点:①在最优解里面每个把手只按一次,按两次没有区别
//②按的顺序无关紧要,最终取决于这个把手按的次数!!!
//思考这个题可以递推出来吗? 答案是:很难
//可以想一想,前面的题都是通过某种顺序,每一次都是影响一个灯泡,但是这个题
//不能使用前面的办法,因为操作一次会影响好多灯泡。所以想一想朴素做法
//我们发现这个题的数据范围很小,所以尝试用暴力解决ac
//暴力思路:①16个开关,所有开关的状态数量想一想是多少? 答案是2^16!
//状态数量即最大操作次数2^16(65536),既然也不大,那就①枚举所有的方案,
// int 是2^32
//然后按照这个方案来操作
//②如果可以实现把手全开,证明此方案合法
//③然后统计这个方案里面需要操作的把手数量
//④在所有能按的开关数量里取一个最小值
//输出方案注意:若两种方案步数相同,按字典序(先按横坐标排序,再按纵坐标排序)
#include
#define x first
#define y second
using namespace std;
typedef pair PII;
const int N=5;
char g[N][N],backup[N][N];
//映射函数
int get(int x,int y){
return x*4+y;//返回第x行第y列上的数是多少
}
void turn_one(int x,int y){
if(g[x][y]=='+') g[x][y]='-';
else g[x][y]='+';
}
void turn_all(int x,int y){
for(int i=0;i>g[i][j];
vector res;//这是记录方案所需要的结构
//枚举所有的方案
for(int op=0;op temp;//temp里面存的是方案
//先备份一下,为什么?因为这又不是最终方案,我们要把所有方案都试一遍,求最少的
memcpy(backup,g,sizeof g);
//枚举16个位置,进行操作
for(int i=0;i>get(i,j)&1) //如果当前位置是1(我们在方案中准备操作)的话--get的作用就是返回二进制数中那一位是第几位,从而判断是否为1
{
temp.push_back({i,j});
//按一下开关
turn_all(i,j);
}
//判断所有灯泡是否全亮
bool has_closed=false;
for(int i=0;itemp.size()) res=temp;//vector容器的操作
}
//还原回来,供下一个方案操作
memcpy(g,backup,sizeof g);
}
//因为没说无解,所以可以猜想一下一定有解
cout
本题仍然是遍历所有的方案
1208. 翻硬币 – AcWing题库
#include
using namespace std;
const int N=107;
char change(char &ch){
if(ch=='*') return 'o';
return '*';
}
char a[N];
char b[N];
int main(){
//读不进去可以尝试 cin>>s+1,cin>>s,cin.ignore(),getline(cin,a),cin.getline(a,N);
cin.getline(a,N);
cin.getline(b,N);
// cin>>(a+1);
// cin>>(b+1);
int n = strlen(a);
int step = 0;
for(int i = 0; i
读入数据:
1.char s[N] cin>>s+1; / cin>>s;
2.cin.ignore();getline(cin,a);
3.cin.getline(a,N);
790. 数的三次方根 – AcWing题库
#include
using namespace std;
double n,l,r,mid;
double eps=1e-8;//精度/100
bool check(double mid,int m){//m次根下
double c=1;
while(m){
c=c*mid;//s次根
m--;//c是mid的3次方
}
//要与别的条件扯上关系 在这里就是与n本身扯上关系
if(c>=n)//如果mid的3次方大于等于n
return true;//还可以再小
else//如果mid的3次方下雨n
return false;//需要更大
}
int main(){
int m=3;
cin>>n;
//设置二分边界
l=-10000,r=10000;//设置大一点
//实数二分
while (l + eps
796. 子矩阵的和 – AcWing题库
#include
using namespace std;
const int N=1007;
//二维前缀和:预处理要与a[i][j]相关联
//预处理:s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j]-s[i-1][j-1] -重复
//实现:(x1,y1)以左上角 (x2,y2)为右上角
//实现: s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1][y2] +重复
//一维差分: 预处理b[i]=a[i]-a[i-1] b[i]改变后面的数都改
//二维差分:
//预处理:
//void insert(int x1,int y1,int x2,int y2){ +重复
//b[x1][y1]+=c;
//b[x2+1][y1]-=c;
//b[x1][y2+1]-=c;
//b[x2][y2]+=c;
//实现:
//b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1] -重复
int a[N][N];
int pre[N][N];
int main(){
int n,m,q;cin>>n>>m>>q;
for(int i=1;i>a[i][j];
}
}
for(int i=1;i>x1>>y1>>x2>>y2;
cout
730. 机器人跳跃问题 – AcWing题库
//递推解方程
#include
using namespace std;
const int N = 1e5 + 10;
int n;
int h[N];
double p[N];//存放2的次幂
//E(i+服务器托管网1)==2Ei-H(i+1)
//E(1)=2X-H(1)
//X>=(E(1)+H(1))/2
int main(){
cin >> n;
for(int i = 1; i > h[i];
p[0] = 1;//2^0=1
double res = 0;//假设最开始的能量值为res 最小值
for(int i = 1; i
1221. 四平方和 – AcWing题库
//写法1:纯暴力
#include
using namespace std;
const int N = 5e6+7;
int n;
signed main () {
int n;cin>>n;
for(int a=0;a*a=c){//记得这里取sqrt时还要判断一下是不是平方数
printf("%d %d %d %d",a,b,c,d);
return 0;
}
}
}
}
return 0;
}
//模拟哈希表
#include
using namespace std;
const int N = 5e6+7;
int n;
struct sum{
int s,c,d;
bool operator>n;
for(int c=0;c*c>1;
if(sum[mid].s>=t)r=mid;
else l=mid+1;//尽量向左边找
}
if(sum[l].s==t){
printf("%d %d %d %dn",a,b,sum[l].c,sum[l].d);
return 0;
}
}
}
return 0;
}
//库函数哈希表
#include
#define int long long
#define x first
#def服务器托管网ine y second
using namespace std;
const int N = 5e6+7;
int n;
unordered_map > has;
signed main() {
cin >> n;
for (int c = 0; c * c
//模拟哈希表
#include
using namespace std;
typedef pair PII;
const int N = 5e6 + 10;
int n;
int has[N * 2];//小技巧,避免pair,r[c^2+d^2]=c;可以推导出d
int main(){
cin >> n;
memset(has, -1, sizeof has);
for(int c = 0; c * c
1227. 分巧克力 – AcWing题库
#include
using namespace std;
#define int long long
const int N=1e5+7;
int n,k;
int h[N],w[N];
//mid是问的输出的答案 在return时候的条件尽量要与题目中的别的变量扯上关系
bool check(int mid){//表示巧克力的最大边长
int cnt=0;
for(int i=1;i=k)return true;
else return false;
}
void solve() {
cin>>n>>k;//n个巧克力 分出来k块 求最大边长
for(int i=1;i>h[i]>>w[i];
}
int l=0,r=max(*max_element(h+1,h+n+1),*max_element(w+1,w+n+1)) ;
while(l>1;
if(check(mid))l=mid;
else r=mid-1;
}
cout
99. 激光炸弹 – AcWing题库
#include
using namespace std;
const int N = 5010;
int n = 5005,m,r;
int sum[N][N];
int get (int x1,int y1,int x2,int y2) {
return sum[x2][y2] - sum[x1 - 1][y2] - sum[x2][y1 - 1] + sum[x1 - 1][y1 - 1];
}
int main () {
cin >> m >> r;
int maxx,maxy;
for (int i = 1;i > x >> y >> w;
x++,y++;
maxx = max (maxx,x);
maxy = max (maxy,y);
sum[x][y] += w;
}
for (int i = 1;i = maxx && r >= maxy) {
cout
1230. K倍区间 – AcWing题库
#include
using namespace std;
#define int long long
const int N=100007;
int a[N];
int cnt[N];//开一个cnt数组 cnt[i]表示的是截止到目前为止余数是i的数有多少个
signed main(){
int n,k;cin>>n>>k;
for(int i=1;i>a[i];
a[i]+=a[i-1]; //前缀和
}
int ans=0;
for(int r=0;r
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
个人浅见,不喜勿喷,谢谢 软件开发是一个涉及多个方面的复杂过程,其中包括选择合适的编程语言和开发环境。编程语言是软件开发的核心,它定义了程序员用来编写指令的语法和规则。而开发环境则提供了编写、测试和调试代码的工具和平台。在本文中,我们将介绍一些主流的编程语言和…