【总结】纪中Day4比赛总结

本文记录了一次编程竞赛的过程,作者在T1题目中使用了bitset优化解决超时问题,T2和T3题目未能在比赛中完成,T4题通过暴力模拟解决。文章强调了清晰理解题意和正确应用算法的重要性。

纪中Day4比赛总结

今天比赛差了点,第三题可以拿点部分分的。
在这里插入图片描述

T1

在这里插入图片描述
在这里插入图片描述
刚开始看还以为是水题,结果发现如果真的完全按照题目所说的来做的话,会超时。
我们将A矩阵的每一行压缩的10进制数,但我们发现太大了会炸掉,所以我们18位18位的压缩。同理,我们将B矩阵的每一行压缩,最后A矩阵和B矩阵做与运算,在异或运算,得出结果后马上和C矩阵对比,只要有一个不相同,马上输出NO,退出。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<bitset>//不得不说bitset真的好用
#define maxn 1100
using namespace std;
int T,n,ans;
int a0[maxn],b0[maxn],a1[maxn],b1[maxn],a2[maxn][maxn],b2[maxn][maxn];
bitset<1000> a[maxn],b[maxn],c[maxn],d;
int scin()
{
	char ch;
	while((ch=getchar())>'1' or ch<'0');
	return ch-'0';
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		for(int i=0;i<1100;++i)
		{
		    a[i].reset();
			b[i].reset();
			c[i].reset();
			d.reset();
		}
		scanf("%d",&n);
		for(int i=1;i<=n;++i)
		 for(int j=1;j<=n;++j)
		  a[i][j]=scin();
		for(int i=1;i<=n;++i)
		 for(int j=1;j<=n;++j)
		  b[j][i]=scin();
		for(int i=1;i<=n;++i)
		 for(int j=1;j<=n;++j)
		  c[i][j]=scin();
		bool f=1;
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=n;++j)
			{
				d=a[i]&b[j];
				ans=d.count()&1;
				if(ans!=c[i][j])
				{
					printf("NO");
					cout<<endl;
					f=0;
					break;
				}
			}
			if(f==0) break;
		}
		if(f==1) 
		{
		    printf("YES");
		    cout<<endl;
	    }
	}
}

T2

暂时没做出来,先跳过。

T3

在这里插入图片描述
在这里插入图片描述
这道题比赛时没有看到,直接白给。
首先,根据题意我们可以画出下图:

在这里插入图片描述
我们用一个结构体保存下每一个三角形的底。因为每个三角形都是等腰直角三角形所以它们的底就等于它们高的两倍:在这里插入图片描述
然后我们以每个三角形的右端点从小到大排序,然后在每个三角形的ab段中查找有哪些三角形的左端点,就可以求出重叠三角形的面积了(注意!可能会有完全包容)。
在这里插入图片描述
但是我的代码实现可能有点问题,所以没有过。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<algorithm>
using namespace std;
long double s=0;
int x,y,n,m;
struct triangle
{
	long long l,r,far,hight;
}t[100010];
bool cmp(triangle x,triangle y)
{
	if(x.l==y.l) return x.r<y.r;
	return x.l<y.l;
} 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		s=0;
		memset(t,0,sizeof(t));
		cin>>m;
		for(int j=1;j<=m;j++)
		{
			cin>>x>>y;
		    t[j].far=y*2;
			t[j].r=x+y;
			t[j].l=x-y;
			s=s+(long double)(t[j].far*1.0*y)*0.5;
		}
		sort(t+1,t+m+1,cmp);
		for(int j=1;j<m;j++)
		{
		    if(t[j].r<=t[j+1].l) continue;
		    else
		    {
		    	if(t[j].r>=t[j+1].r)t[j+1]=t[j];
		    	if(t[j].r<t[j+1].r)
		    	 s-=(long double)((t[j].r-t[j+1].l)*1.0*(t[j].r-t[j+1].l)*0.5)*0.5;
			}
		}
		printf("%.2Lf",s);
		cout<<endl;
	}
} 

附样例

输入
输出

T4

在这里插入图片描述

在这里插入图片描述
又是一道水题,直接暴力模拟。但是注意,当要填充的是数字时,p1=1或p1=2都是一样的。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
using namespace std;
bool zm(string sum1,int k)
{
	if(sum1[k]>='a'&&sum1[k]<='z') return 1;
	else return 0;
}
bool sz(string sum2,int k1)
{
	if(sum2[k1]>='0'&&sum2[k1]<='9') return 1;
	else return 0;
}
int main()
{
//	freopen("expand.in","r",stdin);
//  freopen("expand.out","w",stdout);
    int p1,p2,p3;
    bool ok=0;
    string sum;
    cin>>p1>>p2>>p3;
    cin>>sum;
    for(int i=0;i<sum.size();i++)
    {
    	ok=0;
    	if(sum[i]=='-')
    	{
    		if(int(sum[i+1])-int(sum[i-1])==1)
    		 ok=1;
    		if(zm(sum,i-1)==1&&zm(sum,i+1)==1&&int(sum[i+1])-int(sum[i-1])>1)
    		{
    			if(p1==1)
    			{
    				if(p3==1)
    				{
    					for(int j=int(sum[i-1])+1;j<=int(sum[i+1])-1;j++)
    					{
    						for(int o=1;o<=p2;o++)
    						 cout<<char(j);
						}
					}
					if(p3==2)
					{
						for(int j=int(sum[i+1])-1;j>=int(sum[i-1])+1;j--)
						 for(int o=1;o<=p2;o++)
						  cout<<char(j);
					}
				}
				if(p1==2)
				{
					if(p3==1)
    				{
    					for(int j=int(sum[i-1])+1;j<=int(sum[i+1])-1;j++)
    					{
    						for(int o=1;o<=p2;o++)
    						 cout<<char(j-32);
						}
					}
					if(p3==2)
					{
						for(int j=int(sum[i+1])-1;j>=int(sum[i-1])+1;j--)
						 for(int o=1;o<=p2;o++)
						  cout<<char(j-32);
					}
				}
				if(p1==3)
				for(int j=int(sum[i-1])+1;j<=int(sum[i+1])-1;j++)
				 for(int o=1;o<=p2;o++) cout<<"*";
			}
			else if(sz(sum,i-1)==1&&sz(sum,i+1)==1&&int(sum[i+1])-int(sum[i-1])>1)
			{
				if(p1==1||p1==2)
    			{
    				if(p3==1)
    				{
    					for(int j=int(sum[i-1])+1;j<=int(sum[i+1])-1;j++)
    					{
    						for(int o=1;o<=p2;o++)
    						 cout<<char(j);
						}
					}
					if(p3==2)
					{
						for(int j=int(sum[i+1])-1;j>=int(sum[i-1])+1;j--)
						 for(int o=1;o<=p2;o++)
						  cout<<char(j);
					}
				}
				if(p1==3)
				for(int j=int(sum[i-1])+1;j<=int(sum[i+1])-1;j++)
				 for(int o=1;o<=p2;o++) cout<<"*";
			}
			else if(ok==0)
			 cout<<sum[i];
		}
		else cout<<sum[i];
	}
//	fclose(stdin);
//	fclose(stdout);
} 

总结

今天感觉有点不行,主要是题意没有弄清楚。


谢谢阅读

基于模拟退火的计算器 在线运行 访问run.bcjh.xyz。 先展示下效果 https://pan.quark.cn/s/cc95c98c3760 参见此仓库。 使用方法(本地安装包) 前往Releases · hjenryin/BCJH-Metropolis下载最新 ,解压后输入游戏内校验码即可使用。 配置厨具 已在2.0.0弃用。 直接使用白菜菊花代码,保留高级厨具,新手池厨具可变。 更改迭代次数 如有需要,可以更改 中39行的数字来设置迭代次数。 本地编译 如果在windows平台,需要使用MSBuild编译,并将 改为ANSI编码。 如有条件,强烈建议这种本地运行(运行可加速、可多次重复)。 在 下运行 ,是游戏中的白菜菊花校验码。 编译、运行: - 在根目录新建 文件夹并 至build - - 使用 (linux) 或 (windows) 运行。 最后在命令行就可以得到输出结果了! (注意顺序)(得到厨师-技法,表示对应新手池厨具) 注:linux下不支持多任务选择 云端编译已在2.0.0弃用。 局限性 已知的问题: - 无法得到最优解! 只能得到一个比较好的解,有助于开阔思路。 - 无法选择菜品数量(默认拉满)。 可能有一定门槛。 (这可能有助于防止这类辅助工具的滥用导致分数膨胀? )(你问我为什么不用其他语言写? python一个晚上就写好了,结果因为有涉及json读写很多类型没法推断,jit用不了,算这个太慢了,所以就用c++写了) 工作原理 采用两层模拟退火来最大化总能量。 第一层为三个厨师,其能量用第二层模拟退火来估计。 也就是说,这套方法理论上也能算厨神(只要能够在非常快的时间内,算出一个厨神面板的得分),但是加上厨神的食材限制工作量有点大……以后再说吧。 (...
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值