首页 > 其他分享 >日常训练日记——7.23

日常训练日记——7.23

时间:2024-07-23 21:28:59浏览次数:6  
标签:25 long int ll 7.23 MAXN 日常 using 日记

  • Atcoder训练
    1. Flipping Signs
      思维
      通过打表观察发现,当负数为偶数时可以全部转化为正,不为偶数时,会留下一个负数,我们取绝对值最小的即可。
#include <bits/stdc++.h>

using namespace std;

using  ll=long long;
ll cd[1000010];
int main(){
	ll n;
	ll sum=0;
	ll mi=2e18;
	cin>>n;
	vector<ll>v(n+1);
	ll fu=0;
	for(int i=1;i<=n;i++){
		cin>>v[i];
		if(v[i]<0)fu++;
		sum+=abs(v[i]);
		mi=min(mi,abs(v[i]));
	}
	if(fu%2==0){
		cout<<sum;
	}else
		cout<<sum-2*mi;
}
  1. Rectangle Cutting
    思维
    通过该点怎么划分的面积小的最大,只要不是矩形最中间的点,都只有一种可能,其他情况都能分一半。
#include <bits/stdc++.h>
using namespace std;

using ll =long long;
ll prefix[1000010];
ll v[1000010];
set<ll>st;
int main(){
	double a,b,c,d;
	cin>>a>>b>>c>>d;
	if(c*2!=a||d*2!=b){
	printf("%.6lf 0",a*b/2);
	}else
	printf("%.6lf 1",a*b/2);
	
}
  1. Maze Master
    一个简单的BFS,但是我卡了半小时也没过,原因在于我每次BFS都是拿一个点去搜索,这可能会导致无法找到最远的两个点之间的最大距离。为了找到迷宫中任意两点之间的最大距离,需要对每一个可通行的点都进行BFS,并记录下所有点之间的距离,然后从中找出最大值。
    举个例子来说明这个问题:
    假设有一个迷宫如下:
5 5
.....
.###.
.....
.###.
.....

在这个迷宫中,如果从左上角的点开始BFS,你可能会找到一个相对较大的距离,但这个距离并不是整个迷宫中最大的距离。
实际上,最大的距离应该是从左上角到右下角,或者从左下角到右上角。
为了找到整个迷宫中任意两点之间的最大距离,需要对每一个可通行的点都进行BFS,并记录下所有点之间的距离,然后从中找出最大值。

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

ll dx[] = {0, 0, -1, 1};
ll dy[] = {1, -1, 0, 0};
char mp[25][25];
ll vis[25][25];
ll ans = 0;
ll d[25][25];
struct Node {
    int x;
    int y;
} v[25 * 25];
int n, m, k = 1;

bool inmp(int x, int y) {
    return x > 0 && x <= n && y > 0 && y <= m;
}

void bfs(int tx, int ty) {
    memset(vis, 0, sizeof vis);
    memset(d, 0, sizeof d);
    queue<pair<ll, ll>> q;
    d[tx][ty] = 0;
    vis[tx][ty] = true;
    q.push({tx, ty});
    while (q.size()) {
        ll x = q.front().first, y = q.front().second;
        q.pop();
        for (int i = 0; i < 4; i++) {
            ll nx = x + dx[i], ny = y + dy[i];
            if (inmp(nx, ny) && mp[nx][ny] == '.' && !vis[nx][ny]) {
                d[nx][ny] = d[x][y] + 1;
                vis[nx][ny] = true;
                q.push({nx, ny});
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> mp[i][j];
            if (mp[i][j] == '.')
                v[k].x = i, v[k++].y = j;
        }
    }
//这里我出问题了,就直接cout<<ans,它只能找到从某个点出发的最大距离,而不能保证这个距离是整个迷宫中任意两点之间的最大距离。

    for (int i = 1; i < k; i++) {
        bfs(v[i].x, v[i].y);
        for (int j = 1; j < k; j++) {
            if (i != j) {
                ans = max(ans, d[v[j].x][v[j].y]);
            }
        }
    }
    cout << ans << endl;
    return 0;
}

  1. Dubious Document 2
    差一分,思维不对,我贪心地从后面开始找但是存在前面为优的情况,死活过不去,
    看了别人代码,找出所有可以插空的位置,然后全部尝试,比较字典序。
    贴上我自己写的代码
#include <bits/stdc++.h>

using namespace std;

int main() {
	string s1, s2;
	cin >> s1 >> s2;
	int le = s1.length();
	int le2 = s2.length();
	string best_s = "";
	
	for (int i = 0; i <= le - le2; ++i) {
		bool can_insert = true;
		string temp_s = s1;
		for (int j = 0; j < le2; ++j) {
			if (s1[i + j] != '?' && s1[i + j] != s2[j]) {
				can_insert = false;
				break;
			}
			temp_s[i + j] = s2[j];
		}
		if (can_insert) {
			for (int k = 0; k < le; ++k) {
				if (temp_s[k] == '?') {
					temp_s[k] = 'a';
				}
			}
			if (best_s == "" || temp_s < best_s) {
				best_s = temp_s;
			}
		}
	}
	
	if (best_s == "") {
		cout << "UNRESTORABLE";
	} else {
		cout << best_s;
	}
	
	return 0;
}
  • 动态规划专题

    1. [NOIP2002]过河卒
      入门的动态规划题,转移方程就是f[i][j] = f[i - 1][j]+f[i][j - 1],加了不可以走的点即马走的点。
      把马走过的点f[i][j]设置为0,即为不可以通过。然后两重for循环一行一行计算得出答案,这里需要注意一下越界问题就行。
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int MAXN = 21;
ll f[MAXN][MAXN]; // 从0,0出发到i,j的路径条数
bool v[MAXN][MAXN]; // 标记马的控制点
int xx[] = {2, 1, -1, -2, -1, -2, 1, 2};
int yy[] = {1, 2, 2, 1, -2, -1, -2, -1};
int main() {
	int n, m, x, y;
	cin >> n >> m >> x >> y;
	// 初始化f数组
	for (int i = 0; i <= n; i++) {
		for (int j = 0; j <= m; j++) {
			f[i][j] = 0;
		}
	}
	// 标记马的控制点
	v[x][y] = true;
	for (int i = 0; i < 8; i++) {
		int tx = x + xx[i];
		int ty = y + yy[i];
		if (tx >= 0 && tx <= n && ty >= 0 && ty <= m) {
			v[tx][ty] = true;
		}
	}
	// 动态规划计算路径条数
	f[0][0] = 1;
	for (int i = 0; i <= n; i++) {
		for (int j = 0; j <= m; j++) {
			if (v[i][j]) continue; // 如果是马的控制点,跳过
			if (i > 0) f[i][j] += f[i - 1][j];
			if (j > 0) f[i][j] += f[i][j - 1];
		}
	}
	cout << f[n][m] << endl;
	return 0;
}
  1. [NOIP2008]传球游戏
    跟上面的过河卒类似,但是我们需要搞清楚i,j的顺序以及,边界和初始状态
    状态转移方程为 f[i][j]=f[i-1][j-1]+f[i-1][j+1]由于是一个圈,当j=n时,j+1=1,当j=1时,j-1=n;
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const ll MAXN = 300;
ll f[MAXN][MAXN]; // 第i次传球,球在第j个人手里的方案数

int main() {
	int n, m;
	cin >> n >> m;
	//初始化
	for (int i = 0; i <= n; i++) {
		for (int j = 0; j <= m; j++) {
			f[i][j] = 0;
		}
	}
	// 即前后人手里的方案数
	//由于是一个圈,当j==n时,j+1=1,当j==1时,j-1=n;
	//初始状态,边界 f[0][1]=1
	f[0][1] = 1;
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			if (j == n ) {
				f[i][j] = f[i-1][j-1]+f[i-1][1];
			}
			else if (j == 1) {
				f[i][j] =  f[i-1][n]+f[i-1][j+1];
			} 
			else if(j!=n&&j!=1){
				f[i][j] = f[i - 1][j-1]+f[i-1][j+1];
			}
		}
	}
	cout << f[m][1] << endl;
	return 0;
}
  • Codeforces

标签:25,long,int,ll,7.23,MAXN,日常,using,日记
From: https://www.cnblogs.com/dontian/p/18318201

相关文章

  • 7.23第二周周二学习总结
    基础算法复习(上午)双指针一本书P页,第i页有知识点ai,同一个知识点可能多次提到,希望通过连续的一些页把所有知识点都覆盖到。求出连续的最少页数#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<cstdio>#defineINF0x3f3f3......
  • 7.23赛后总结
    T1牛式得分:14题型:暴力枚举枚举思路完全错误,过于复杂,成功的只A了一个点.T2song得分:50(洛谷),0(评测机)题型:模拟不知道为什么评测机评测不出来时间太紧,导致符号敲错,‘+‘敲成’-’T3skate题型:深度优先搜索得分:50在DFS函数末尾取消了对路径的标记,导......
  • 【闲话】07.23.24
    0723闲话头图:今日推歌:《死别feat.GUMI》シャノンさよなら夏、また会う日まで再见了夏天,直到再见的那天さよなら夏、君との思い出再见了夏天,和你一起的回忆もしもそうじゃなかったら“假如不是这样的话……”なんてこわいこと我试着想象了一下考えてみたよ这种可......
  • 2024.7.23 Linux——DNS服务搭建(day12)
    (一)搭建nginx1.首先布置基本环境要求能够ping通外网,有yum源2.安装nginxyum-yinstallnginx然后查看验证 3.修改网页配置文件修改文件,任意编写内容,然后去物理机测试(二)创建一台客户端1.模拟一下客户,用母机克隆一台作为我们的客户端然后只需修改地址,保证能够ping......
  • 基于java+springboot+vue实现的公司日常考勤系统(文末源码+Lw)132
     基于SpringBoot+Vue的实现的公司日常考勤系统(源码+数据库+万字Lun文+流程图+ER图+结构图+开题报告+演示视频+软件包)选题背景及意义:分析企业的考勤管理系统过程可以看到,考勤管理系统中主要要解决的是:1.考勤信息的管理;2.考勤、出勤信息的请假及申请;3.给系统设定用户登录权......
  • 【日记】坏了,0721 真成为柚子厨的标记了(418 字)
    正文今天是7月21号,0721,然后柚子社入驻B站了,开始我以为是整活,结果发现是真的。草,这下0721真成柚子厨纪念日了。有点难绷又有点好笑。睡觉的一天。我原以为14:30睡到16:30差不多了,結果一觉睡到17:30。草。我想着周末,也就没设闹钟了,睡到什么时候随缘。渐渐习......
  • 【日记】雪王的门店这么危险没问题吗……(1168 字)
    正文最近总是隐隐地想写些什么东西。但一直没有时间。而且每当提起笔时,又不知道如何开头。心中的这团火,似乎不化为文字,就永远也消不下去。最近一直、一直——都是这样的感受。说实话,最近很长一段时间都十分苦闷。我似乎能摸到由头,但是也并非十分明确。有一天,......
  • NGINX的日常使用之负载均衡
    负载均衡在nginx中的使用文章目录目录负载均衡在nginx中的使用前言一、负载均衡是什么?二、负载均衡的类型和应用1.硬件负载均衡器:2.软件负载均衡器三、负载均衡的好处四、负载均衡在nginx中的使用1、基本的nginx负载均衡配置示例2、Nginx负载均衡的关键特性(1)N......
  • Java学习日记 (day4)
    习题练习1. 输入某年某月某日,判断这一天是这一年的第几天?输入某年某月某日,判断这一天是这一年的第几天packagetest.test2_1;importjava.util.Scanner;publicclassTest_1{publicstaticintsearch_month(intm,int[]arr){if(m==2){......
  • 日常记录-FreeMarker模板简单使用
    1.依赖包<dependency>   <groupId>org.freemarker</groupId>   <artifactId>freemarker</artifactId>   <version>2.3.30</version></dependency>2.工具类 importfreemarker.template.Configuration;importfreemarke......