当前位置: 首页 > news >正文

洛谷刷题小结

#include <iostream>
using namespace std;
int n, m,ans=0;
char s[105][105];
//深搜
void dfs(int x, int y) {
    //将搜索到的水坑看为干地
    s[x][y] = '.';
    //确定八个方向
    int next[8][2] = {
        {0,1},
        {0,-1},
        {1,0},
        {-1,0},
        {1,1},
        {1,-1},
        {-1,1},
        {-1,-1},
    };
    //朝八个方向搜索
    for (int k = 0; k < 8; k++) {
        int tx = x + next[k][0];
        int ty = y + next[k][1];
        if (tx<1 || tx>n || ty<1 || ty>m) {
            continue;
        }
        if (s[tx][ty]=='W') {
            dfs(tx, ty);
        }
    }
    return;
}
int main()
{
    cin >> n >> m;
    //输入地形
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> s[i][j];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            //如果是水坑,搜索
            if (s[i][j] == 'W') {
                dfs(i, j);
                //水塘数目加一
                ans++;
            }
        }
   }
    cout << ans << endl;
}

#include <iostream>
using namespace std;
int m, n;
int a[10];
void print(int x) {
    for (int i = 1; i < x; i++) {
        cout << a[i] << "+";
    }
    cout << a[x] << endl;
}
//搜索
void dfs(int x) {
    //回溯后跳出
    for (int i = a[x - 1]; i <= n; i++) {
        //防止输出n
        if (i == m) {
            continue;
        }
        a[x] = i;
        n -= i;
        //排列完毕,输出
        if (n == 0) {
            print(x);
        }
        //否则继续搜索
        else {
            dfs(x + 1);
        }
        n += i;
    }
}
int main()
{
    for (int i = 0; i < 10; i++) {
        a[i] = 1;
    }
    cin >> m;
    n = m;
    dfs(1);
    return 0;
}

 状压是什么,不寄丢啊,看见是搜索里的,没看标签,我就搜了,也是成功卡九十分死活过不了,也是成功被拿下了......,参考全排列的方法做的,代码有些多余的,不必理会

#include <iostream>
#include <cmath>
using namespace std;
int n;
double ans = 2e9, sum = 0;
struct yyc {
    double x;
    double y;
}q[20];
int book[20], a[20];
double distance(double x, double y, double a, double b) {
    return sqrt(((x - a) * (x - a) + (y - b) * (y - b)));
}
void dfs(double x, double y, int step)
{
    int i;
    if (sum > ans) {
        return;
    }
    if (step == n + 1) {
        ans = min(ans, sum);
        /*for (i = 1; i <= n; i++) {
            printf("    %d", a[i]);
        }
        printf("\n");
        cout << ans << endl;*/
        return;
    }
    for (i = 1; i <= n; i++) {
        if (book[i] == 0) {
            book[i] = 1;
            a[step] = i;
            sum += distance(x, y, q[a[step]].x, q[a[step]].y);
            dfs(q[a[step]].x, q[a[step]].y, step + 1);
            sum -= distance(x, y, q[a[step]].x, q[a[step]].y);
            book[i] = 0;
        }
        /*if (book[i] == 0) {
            a[step] = i;
            book[i] = 1;
            dfs(0,0,step + 1);
            book[i] = 0;
        }*/
    }
    return;
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> q[i].x >> q[i].y;
    }
    dfs(0, 0, 1);
    printf("%.2lf\n", ans);
}

#include <iostream>
using namespace std;
int book[205], s[205][2];
//定义结构体存储数据
struct yyc {
    int x;
    int s;
}q[40005];
int main()
{
    int n, a, b;
    cin >> n >> a >> b;
    //特例:如果a和b'是同一层,输出0;
    if (a == b) {
        cout << 0 << endl;
        return 0;
    }
    //输入每层电梯走的楼的层数
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        s[i][0] = x;
        s[i][1] = -x;
    }
    int head = 1, tail = 1;
    q[tail++].x = a;
    q[head].s = 0;
    //检测能不能到达
    int  flog = 0;
    long long step = 0;
    //广搜
    while (head < tail) {
        for (int k = 0; k < 2; k++) {
            int tx = q[head].x + s[q[head].x][k];
            //cout << tx << endl;
            if (tx<1 || tx>n) {
                continue;
            }
            if (book[tx] == 0){
                book[tx] = 1;
                q[tail].x = tx;
                q[tail].s = q[head].s + 1;
                tail++;
            }
            if (tx == b) {
                flog = 1;
                break;
            }
        }
        if (flog == 1) {
            break;
        }
        head++;
    }
    //flog为零无法到达输出-1
    if (flog == 0) {
        cout << -1 << endl;
        return 0;
    }
    //反之,输出次数
    cout << q[tail-1].s << endl;
    return 0;
}

 

#include <iostream>
using namespace std;
int a[5], b[25][5];
int ans=0,minx,l,r;
void dfs(int x, int y) {
	if (x > a[y]) {
		minx = min(minx, max(l, r));
		return;
	}
	l += b[x][y];
	dfs(x + 1, y);
	l -= b[x][y];
	r += b[x][y];
	dfs(x + 1, y);
	r -= b[x][y];//毫无技巧的搜索回溯
}
int main()
{
	cin >> a[1] >> a[2] >> a[3] >> a[4];
	for (int i = 1; i <= 4; i++) {//减少码量
		l = 0,r=0;
		minx = 2e9;
		for (int j = 1; j <= a[i]; j++)
			cin >> b[j][i];
		dfs(1, i);
		ans += minx;
	}
	cout << ans << endl;
}

 

#include <iostream>
using namespace std;
int n, m,c;
int a[1000005];
//二分查找
int find(int x) {
	int l = 1, r = n;
	//当l和r没相遇时
	while (l < r) {
		//中间值
		int mid = (l + r) / 2;
		//要找的数小于等于中间值,右边界为中间值
		if (x <= a[mid]) {
			r = mid;
		}
		//否则左边界为中间值加一
		else {
			l = mid + 1;
		}
	}
	//找到输出l。否则输出-1;
	if (a[l] == x)
		return l;
	return -1;
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	for (int i = 1; i <= m; i++) {
		scanf("%d", &c);
		int ans = find(c);
		printf("%d ", ans);
	}
	return 0;
}

相关文章:

  • 编译uboot的Makefile编写
  • system V 共享内存
  • React 记账本项目实战:多页面路由、Context 全局
  • Dolphinscheduler3.2.1运行Java Jar路径重复的BUG修复问题
  • MySQL 用 limit 影响性能的优化方案
  • 深入学习OpenCV:第一章简介
  • (二十二)安卓开发中的数据存储之SQLite简单使用
  • 《轨道力学导论》——第一讲:轨道力学概述
  • 案例驱动的 IT 团队管理:创新与突破之路: 第四章 危机应对:从风险预见到创新破局-4.1.2债务评估模型与优先级排序
  • 阻塞与非阻塞等待非阻塞轮询
  • 代码,Java Maven项目打包遇到的环境问题
  • 针对OPPO A5(PBAM00)在锁屏界面屏幕无法滑动的问题.
  • STM32 HAL库 HC-05蓝牙通信实现
  • 《嵌入式系统原理》一些题目
  • Mysql5.7配置文件
  • StickyNotes,简单便签超实用
  • 变点分组法是一种时序数据处理与分段分析的方法
  • 聊聊Spring AI的Prompt
  • 20250414| AI:RAG多路召回和融合重排序技术
  • Android Studio 在 Windows 上的完整安装与使用指南
  • 孙卫东会见巴基斯坦驻华大使:支持巴印两国实现全面持久停火
  • 阿坝州委书记徐芝文已任四川省政府党组成员
  • 人民日报钟声:通过平等对话协商解决分歧的重要一步
  • 中国潜水救捞行业协会发布《呵护潜水员职业健康安全宣言》
  • 女高音吴睿睿“古词新唱”,穿着汉服唱唐诗宋词
  • 来伊份深夜回应“粽子中吃出疑似创可贴”:拿到实物后会查明原因