首页 > 其他分享 >补题报告

补题报告

时间:2024-10-02 14:22:53浏览次数:6  
标签:报告 int dfs ny 补题 && include dp

背景

2024-10-1上午打的比赛(CSP-J模拟),作赛后总结报告。


交替出场(Alter)

赛时AC。

思路

1.先将结果数设为长度(默认每个长度为1的子串符合要求)  
2.遍历每个子串,判断是否满足01交替串,是+1   
3.输出  

我的代码
#include <iostream>
#include <string>
#include <cstring>
#include <string.h>
using namespace std;
string s;
int n;
int main() {
//	freopen("alter.in","r",stdin);
//	freopen("alter.out","w",stdout);
 cin >> s;
 int l = s.length();
 n = l;
 for(int i=0; i+1<l; ++i) {
 	for(int j=i+1; j<l; ++j) {
 		bool flag=0;
 		for(int k=i+1; k<=j; ++k) {
 			if(s[k] == s[k-1]) {
 				flag=1;
 				break;
 			}
 		}
 		if(!flag) ++n;
 	}
 }
 cout << n;
//	fclose(stdin);
//	fclose(stdout);
 return 0;
}

时间复杂度\(O(N^3)\)


正解

枚举左端点,一位一位向右扩展。

正解代码
#include <iostream>
using namespace std;
int cnt;
string s; 
int main(){
 cin >> s;
 s = ' ' + s;
 int l = s.size();
 for(int i=1;i<=l-1;++i){
 	++cnt;
 	for(int j=i+1;j<=l;++j){
 		if(s[j] + s[j-1] == '0' + '1') ++cnt;
 		else break;
 	}
 }
 cout << cnt;
 return 0;
}

时间复杂度\(O(N^2)\)


翻翻转转(filp)

赛时TLE+WA(悲)

思路(我的)

1.根据\(S_5\),推出\(S_n[k]\)由\(S_n[k-x]\)转化来 (x为最大的小于k的二的正整数次幂)
2.一步一步减,直到\(k=1/k=2\)
但 是 写 炸 了

我的代码

#include <bits/stdc++.h>
#define long long int
using namespace std;
int t;
int num[44];
string s[44];
bool q[3] = {0,1,0};

int f(int a){
   int l = 1;
   int r = 31;
   while(l <= r){
   	int mid = (l+r) >> 1;
   	if(num[mid] <= a) l = mid + 1;
   	else r = mid - 1;
   }
   return r;
}

signed main() {
//	freopen("filp.in","r",stdin);
//	freopen("filp.out","w",stdout);
   
   for(int i=1;i<=30;++i)
   	num[i] = pow(2,i);
   cin >> t;
   while(t--){
   	int x;
   	cin >> x;
   	bool flag = 0;
   	while(x != 1 && x != 2){
   		int k = f(x); 
   		x -= num[k];
   		flag = !flag;
   	} 
   	cout << flag && q[x];
   } 
   
//	fclose(stdin);
//	fclose(stdout);
   return 0;
}

正解

观察,得每一个串从中间劈开,前后为取反关系
可考虑分治
判断:如果答案在前半段,继续递归。
如果答案在后半段,通过递归上来的答案取反后再上传即可。

正解代码

#include <iostream>
using namespace std;
int t,x;

void f(int l,int r,int k){
	if(l == x && r == x) { 
		cout << (k==1) << "\n";
		return ;
	}
	int mid = (l+r) >> 1;
	if(x <= mid) f(l,mid,k);
	else f(mid+1,r,~k);
	return ;
}

int main(){
	cin >> t;
	while(t--){
		cin >> x;
		f(1,1<<30,1);//1<<30 ----> 2^30
	}
	return 0;
}

方格取数(square)

赛时10分(用dfs)
赛后讲解时发现没判边界(大悲)
加后60分
搜索一点要判边界!!!!!

思路(我的)

基础DFS+步数判断

10分(90分RE)代码

#include <bits/stdc++.h>
#define long long int
using namespace std;
const int maxn = 211;
int n,m,k;
int g[maxn][maxn];
int ans;
bool flag;
void dfs(int x,int y,int cnt,int sum,int p) {
	if(cnt >= k) return ;
	if(x == n && y == m) {
		flag = 1;
		ans = max(ans,sum+g[n][m]);
		return ;
	}
	if(p == 2) {
		dfs(x+1,y,cnt+1,sum+g[x][y],0);
		dfs(x,y+1,cnt+1,sum+g[x][y],1);
	}else if(p == 1){
		dfs(x+1,y,1,sum+g[x][y],0);
		dfs(x,y+1,cnt+1,sum+g[x][y],1);
	}else{
		dfs(x+1,y,cnt+1,sum+g[x][y],0);
		dfs(x,y+1,1,sum+g[x][y],1);
	}
	return ;
}
signed main() {
//	freopen("square.in","r",stdin);
//	freopen("square.out","w",stdout);
	
	cin >> n >> m >> k;
	for(int i=1; i<=n; ++i)
		for(int j=1; j<=m; ++j)
			cin >> g[i][j];
	dfs(1,1,0,0,2);
	if(flag) cout << ans;
	else cout << "No Answer!";
	
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

60分(40分TLE)代码

#include <bits/stdc++.h>
#define long long int
using namespace std;
const int maxn = 211;
int n,m,k;
int g[maxn][maxn];
int ans;
bool flag;
void dfs(int x,int y,int cnt,int sum,int p) {
	if(cnt >= k) return ;
	if(x == n && y == m) {
		flag = 1;
		ans = max(ans,sum+g[n][m]);
		return ;
	}
	if(p == 2) {
		if(x+1>=1&&x+1<=n&&y>=1&&y<=m) dfs(x+1,y,cnt+1,sum+g[x][y],0);
		if(x>=1&&x<=n&&y+1>=1&&y+1<=m) dfs(x,y+1,cnt+1,sum+g[x][y],1);
	}else if(p == 1){
		if(x+1>=1&&x+1<=n&&y>=1&&y<=m) dfs(x+1,y,1,sum+g[x][y],0);
		if(x>=1&&x<=n&&y+1>=1&&y+1<=m) dfs(x,y+1,cnt+1,sum+g[x][y],1);
	}else{
		if(x+1>=1&&x+1<=n&&y>=1&&y<=m) dfs(x+1,y,cnt+1,sum+g[x][y],0);
		if(x>=1&&x<=n&&y+1>=1&&y+1<=m) dfs(x,y+1,1,sum+g[x][y],1);
	}
	return ;
}
signed main() {
//	freopen("square.in","r",stdin);
//	freopen("square.out","w",stdout);
	
	cin >> n >> m >> k;
	for(int i=1; i<=n; ++i)
		for(int j=1; j<=m; ++j)
			cin >> g[i][j];
	dfs(1,1,0,0,2);
	if(flag) cout << ans;
	else cout << "No Answer!";
	
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

正解

\(DP\)
类似数字三角形
核心数组:\(dp[x][y][l][f]\)
\(x\):横坐标
\(y\):纵坐标
\(l\):步数
\(f\):方向

方程:
  1. 方向一致且不超步数:

\[dp[nx][ny][l + 1][nd] =\max(本身, dp[x][y][l][d] +a[nx][ny]); \]

  1. 方向不一致:

\[dp[nx][ny][1][nd] = \max(本身, dp[x][y][l][d] + a[nx][ny]); \]

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 210;
ll dx[2] = {1, 0}, dy[2] = {0, 1};
ll n, m, k, a[N][N], dp[N][N][N][2], ans = -1e18;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m >> k;
	for (ll i = 1; i <= n; i++)
		for (ll j = 1; j <= m; j++)
			cin >> a[i][j];
	memset(dp, -0x3f, sizeof(dp));
	dp[1][1][0][0] = dp[1][1][0][1] = a[1][1];
	for (ll x = 1; x <= n; x++)
	  for (ll y = 1; y <= m; y++)
		for (ll l = 0; l < k; l++)
			for (ll d = 0; d <= 1; d++) {
				if (dp[x][y][l][d] < -1e18) continue;
				for (ll nd = 0; nd <= 1; nd++) {
				  ll nx = x + dx[nd], ny = y + dy[nd];
				  if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
				  if (d != nd)
				    dp[nx][ny][1][nd] = max(dp[nx][ny][1][nd], dp[x][y][l][d] + a[nx][ny]);
				  else if (l < k - 1)
				    dp[nx][ny][l + 1][nd] =max(dp[nx][ny][l + 1][nd], dp[x][y][l][d] +a[nx][ny]);
				}
			}
	for (ll l = 0; l < k; l++)
		for (ll d = 0; d <= 1; d++)
			ans = max(ans, dp[n][m][l][d]);//查找不同步数不同方向到A[n][m]的最大值
	if (ans == -1e18)//未改变
		cout << "No Answer!";
	else
		cout << ans;
	return 0;
}

圆圆中的方方(round)

思路

一个一个样例分析
\(Sub1\) 样例,送分
\(Sub2\) 由描述+勾股定理得矩形一定在圆内,重叠部分是矩形面积
\(Sub3\) 分析,得圆一定在矩形内,重叠部分是圆面积
\(Sub4∼6\) 正解思路
\(Sub7\) 分四种情况,两种正常,两种可用三角函数

#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1), eps = 1e-6;
double n, m, x, y, r;
double calc(double n, double m, double r) {
  if (n > m)
    swap(n, m);
  if (n < eps || m < eps)
    return 0;
  if (r <= n)
    return 0.25 * pi * r * r;
  else if (r <= m) {
    double tt = sqrt(r * r - n * n);double res = n * tt / 2.0;double ang = pi / 2 - acos(n / r);
    res += ang / 2 * r * r;
    return res;
  } else if (r <= sqrt(n * n + m * m)) {
    double t1 = sqrt(r * r - n * n), t2 = sqrt(r * r - m * m);double res = n * t1 / 2.0 + m * t2 / 2.0;double ang = pi / 2 - acos(n / r) - acos(m / r);
    res += ang / 2 * r * r;
    return res;
  } else
    return n * m;
}
int main() {
  cin >> n >> m >> x >> y >> r;
  cout << fixed << setprecision(10) << calc(x, y, r) + 
    calc(x, m - y, r) + calc(n - x, y, r) + calc(n - x, m - y, r)<< endl;
  return 0;
}

官方题解

标签:报告,int,dfs,ny,补题,&&,include,dp
From: https://www.cnblogs.com/Picecone-zzs/p/18444701

相关文章

  • DAY1-补题
    说句闲话:研究补题最好的方式是补完AK了,祝你们成功(滑稽此文章仅作为补题,题解等我理解完掉重新写。比赛情况不可饶恕的错误(滑稽赛时第一题看错题意,导致明明可以做掉的内容爆了,T2考虑到了正解,可一直在推式子和打表中间晃荡,遗憾。T3很好笑,没有删除调试语句,赛后删了重交过到了30pt......
  • vulnhub-Lampiao靶机的测试报告
    目录一、测试环境1、系统环境2、使用工具/软件二、测试目的三、操作过程1、信息搜集2、Getshell3、提权四、结论一、测试环境1、系统环境渗透机:kali2021.1(192.168.202.134)靶 机:Linuxlampiao4.4.0-31-generic#50~14.04.1-Ubuntu2、使用工具/软件Kali:arp......
  • vulnhub-EvilBox---One靶机的测试报告
    目录一、测试环境1、系统环境2、使用工具/软件二、测试目的三、操作过程1、信息搜集①主机探测②端口和服务探测③扫描目录2、进行渗透①渗透网页②渗透空白页③测试evil.php的文件包含3、Getshell①查看ssh是否支持私钥登录②获取私钥进行登录③John爆破ssh......
  • 【可答疑】基于51单片机的智能温室大棚控制系统(含仿真、代码、报告等)
     ✨哈喽大家好,这里是@每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~......
  • 【可答疑】基于51单片机的智能窗帘(含仿真、代码、报告等)
     ✨哈喽大家好,这里是@每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~......
  • 【解题报告】P8477 「GLR-R3」春分
    P8477「GLR-R3」春分题目看起来比较魔怔,考虑怎么搞一下。首先,一个最简单的想法,每对溶液组都配一个板子,可以用\(n^2\)个板子解决,看得出来很不优啊,但是可以得到Sub1的分数。节俭一点,我们如果把每个板子都拿出来一面用来对应一种溶液,此时就可以拼起来,只需要\(2n\)个板子解......
  • 【开题报告】基于Springboot+vue某博物馆数字藏品管理系统(程序+源码+论文) 计算机毕业
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和数字化时代的到来,博物馆作为传承人类文明与文化的重要场所,正经历着前所未有的变革。传统博物馆的藏品管理、展示及互动方式......
  • 【可答疑】基于51单片机的智能加湿器(含仿真、代码、报告等)
     ✨哈喽大家好,这里是@每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~......
  • P11130 解题报告
    场外选手口胡题目传送门题目大意:\(T\)组询问,每次给定两个正整数\(a,b\)。定义一种操作为:选择一个正整数\(y\),将\(x\)变成\(x\times\gcd(a,y)\)。对每组询问回答:将\(a\)变成\(y\)最少需要几次操作。数据范围:\(1\leT\le2\times10^5,1\lea\leb\le10^{18}\)......
  • 基于django+vue+Vue《大学计算机》课程思政资源共享平台【开题报告+程序+论文】-计算
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,高等教育领域正经历着深刻的变革。《大学计算机》作为培养大学生信息素养与计算思维能力的核心课程,其教学质量直接......