首页 > 其他分享 >10.16考试总结

10.16考试总结

时间:2024-10-18 16:43:36浏览次数:1  
标签:总结 return int 白点 黑点 ans girl 考试 10.16

T1 最小生成树

题面:给你一个无向带权连通图,每条边是黑色或白色。让你求一棵恰好有 \(need\) 条白色边的
权值和最小的生成树。题目保证有解。
题解:
最小生成树,自然而然想到kruskal算法,但我们要让白点恰好有 \(need\) 条,在白点多的时候,要多选黑点,在白点少的时候,要多选白点,所以我们可以根据白点选择情况对黑点的权值进行调整,在白点多的时候,减少黑点权值,在白点少的时候,增加黑点权值,然后发现随着黑点权值增加量的增加,白点数量单调递增,所以考虑二分。

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,k,fa[N],ans,need,sum,cnt;
struct node
{
	int u,v,w,cl;
}bi[N];
int find(int x)
{
	if(x==fa[x])return x;
	else return fa[x]=find(fa[x]);
}
bool cmp(node x,node y)
{
	if(x.w!=y.w)return x.w<y.w;
	else return x.cl<y.cl;
}
void kus()
{
	sum=0,cnt=0,need=0;
	for(int i=1;i<=n;i++)fa[i]=i;	
	for(int i=1;i<=m;i++)
	{
		int f1=find(bi[i].u),f2=find(bi[i].v);
		if(f1==f2)continue;
		cnt++;
		if(bi[cnt].cl==0)need++;
		fa[f2]=f1;
		sum+=bi[i].w;
		if(cnt==n-1)return;
	}
}
int main()
{
	freopen("e.in","r",stdin);
	freopen("e.out","w",stdout);	
	ios::sync_with_stdio(0); 
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++)
		cin>>bi[i].u>>bi[i].v>>bi[i].w>>bi[i].cl;
	int l=-1005,r=1005;
	while(l<r)
	{
		int mid=l+(r-l)/2;
		for(int i=1;i<=m;i++)if(bi[i].cl==0)bi[i].w+=mid;
		sort(bi+1,bi+m+1,cmp);
		kus();
		for(int i=1;i<=m;i++)if(bi[i].cl==0)bi[i].w-=mid;
		if(need>=k)ans=sum-mid*k,l=mid+1;
		else r=mid;
	}
	cout<<ans<<endl;
	return 0;
}

反思:做过这道题,甚至不止一次,但考场上没做出来,还是自己学的不太好。

T2 矩阵游戏

反向思考,一个正对角线上都有黑点,每个黑点都来自原图的某一行某一列,因为交换操作,同一列同一行的点始终在同一列同一行。所以原图的这一行和这一列绑定起来贡献一个点在对角线上,所以对每个黑点行列连边。跑二分匹配图,有完美匹配就有解,否则无解。

#include <bits/stdc++.h>
using namespace std;
const int M=4e4+10,N=4e4+10;
int t,n,tot,nxt[M],go[M],hd[N],girl[N],ans;
bool vis[N];
void add(int x,int y)
{
	nxt[++tot]=hd[x];go[tot]=y;hd[x]=tot;
	return ;
}
bool find(int x)
{
	for(int i=hd[x];i;i=nxt[i])
	{
		int v=go[i];
		if(vis[v])continue;
		vis[v]=1;
		if(!girl[v]||find(girl[v]))
		{
			girl[v]=x;
			return 1;
		}
	}	
	return 0;
} 
int main()
{
	freopen("f.in","r",stdin);
	freopen("f.out","w",stdout);	
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>t;
	while(t--)
	{
		tot=0,ans=0;
		memset(hd,0,sizeof(hd)); 
		memset(girl,0,sizeof(girl));
		cin>>n;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			{
				int x;cin>>x;
				if(x==1)add(i+n,j);
			}
		for(int i=1+n;i<=2*n;i++)
		{
			ans+=find(i);
			for(int i=1;i<=n;i++)vis[i]=0;
		}
		if(ans==n)cout<<"Yes"<<'\n';
		else cout<<"No"<<'\n';
	} 
	return 0;
} 

反思:想到了做法,同时写出了程序,但因为一开始遇到不符合条件就输出No,所以有地方没清零,挂了20分,以后每次输出清零后的数组检查。

T3 贪吃蛇

爆搜加一种alpha-beta剪枝,直接做。

#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 25
#define CT 51
#define inf 0x3f3f3f3f
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int grid[maxn][maxn],n,m;
int dfs(int rnd,int player,int alpha,int beta,int fx,int fy,int px,int py)
{
	int flag=0,ans;
	if(player==1)ans=beta;
	else ans=alpha;
	for(int i=0;i<4;i++)
	{
		int x=fx+dx[i],y=fy+dy[i];
		if(x&&y&&x<=n&&y<=m&&!grid[x][y])
		{
			flag=1;
			int cur;
			grid[x][y]=player;
			if(player==1)cur=dfs(rnd+1,2,alpha,ans,px,py,x,y);
			else cur=dfs(rnd+1,1,ans,beta,px,py,x,y);
			grid[x][y]=0;
			if(player==2&&cur<=beta)return beta;
			if(player==1&&cur>=alpha)return alpha;
			if(player==1)ans=max(ans,cur);
			else ans=min(ans,cur);
		}
	}
	if(!flag)
	{
		if(player==1)return -CT+rnd;
		else return CT-rnd;//提示:如果自己能赢,一定会尽量快地赢;如果自己会输,一定会死得尽量晚.
	}
	return ans; 
}
int main()
{
	freopen("h.in","r",stdin);
	freopen("h.out","w",stdout);
	scanf("%d%d",&n,&m);
	int x1,y1,x2,y2;
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m; j++)
		{
			scanf("%d",&grid[i][j]);
			if(grid[i][j]==1) x1=i,y1=j;
			if(grid[i][j]==2) x2=i,y2=j;
		}
	int ans=dfs(1,1,inf,-inf,x1,y1,x2,y2); 
	if(ans<0) printf("2 %d\n",ans+CT);
	else  printf("1 %d\n",CT-ans);
	return 0;
}

反思:至少应该把爆搜写出来。

T4 信息拦截

挖坑。

标签:总结,return,int,白点,黑点,ans,girl,考试,10.16
From: https://www.cnblogs.com/storms11/p/18474581

相关文章

  • 10.14 总结
    T1赛时没有想到什么思路。下文中所有的\(t\)代表所有的文件中的一个。考虑DP定义\(f_{i,j}\)为已经考虑完了\(s\)中的前\(i\)个点,匹配了\(t\)的前\(j\)个点的方案数,转移就是:\[\begin{cases}s_{i+1}=t_{j+1}&f_{i+1,j+1}\getsf_{i,j}\\s_{i+1}......
  • YOLO系列:YOLOv5总结
    介绍2020年6月25日,Ultralytics发布了YOLOV5的第一个正式版本,其性能与YOLOV4不相伯仲,同样也是现今最先进的对象检测技术,并在推理速度上是目前最强,yolov5按大小分为四个模型yolov5s、yolov5m、yolov5l、yolov5x。操作流程图如下:环境配置Anaconda+Pycharm安装好所需版本的A......
  • C语言小白记录自己的错题和总结
    ​计算n个a的思路都是用a+a10+a100……然后在累加记得用include<math.h>pow考察逗号表达式即使像x+y x+7之类的算出结果后x和y还是不变因为没有赋值所以x和y都是原来的值问号语句先计算第一个表达式若他的值为非0(即真)将表达式2的值作为条件表达式的值反之为0即假......
  • 8.12~8.24 总结
    8.12[ARC159B]GCDSubtraction题意:没必要讲,就是题面。按题目直接模拟会超时,考虑优化。发现在\(a,b\)互质时特别慢,每次只能减一,因此应将减一的操作合并。设会减\(x\)次一,则\(\gcd(a-x,b-x)=c(c\ne1)\)。则\(a-x\equivb-x\pmodc\),\(a\equivb\pmodc\)......
  • Python基础知识总结
    变量#变量定义name="name"age=18height=1.75#多个变量赋值a=b=c=1print(a,b,c)字符串#字符串定义及输出str1="hello"str2='world'print(str1,str2)#字符串格式化输出print("name:%s,age:%d,height:%.2f"%(name,age,height))#字符串拼接str3=str1+str2pri......
  • 10.17noip联考总结
    10.17noip联考总结今天的命题人是xde……T1最后大约两个小时的时候想到了正解,但是在处理边界的时候出了问题,大样例一直过不了。其实只需要把数值统计下来再计算就行了。T2其实我们把给定的数给二进制拆开,就会发现其实就是对数进行调整把0调整为1。根据这个思路可以构造出一......
  • 10.7 模拟赛总结
    T1ZYB建围墙题意给你一个数\(n\),求把这\(n\)个格子围起来所需的格子数的最小值。思路首先,我们尝试把图画出来枚举前面来找出规律。下面这张图里是1~10的距离。好的,我们可以发现。在这个图中7这个图内部是六边形。外面一圈绿色的也是六边形。这个时候我们发现数据中......
  • 2024-2025-1 20241401 《计算机基础与程序设计》 第四周学习总结
    班级链接2024计算机基础与程序设计作业要求作业要求作业目标①门电路②组合电路,逻辑电路③冯诺依曼结构④CPU,内存,IO管理⑤嵌入式系统,并行结构⑥物理安全教材学习内容总结《计算机科学概论》第四章、第五章门:非(NOT)门、与(AND)门、或(OR)门、异或(XOR)......
  • 2024/10/17 模拟赛总结
    \(100+50+0+35=185\),呃呃呃,终于吃上LRX了#A.语言考虑名词性词组的性质,由于它可以由任意名词,形容词和名词性词组拼接起来,那么连续的名词,形容词或交替出现都是可行的但是如果最后一个是形容词不可行,不然它就无法修饰其他词语了于是可以枚举那一个单独的动词,判断前面和后面知......
  • 期货交易基础知识考试题
    题库包含选择题40题、判断题41题。选择题:1.根据涨停板制度,期货合约在一个交易日中的交易价格波动(可以小于等于)规定的涨跌幅度。2.经营机构应当利用投资者评估数据库及交易行为记录等信息,持续跟踪和评估投资者风险承受能力,必要时调整期风险承受能力等级。经营机构调整投资者风险......