洛谷普及练习场——简单地模拟(前三题)

这篇博客介绍了洛谷普及组的前两道模拟题,包括‘p1003——铺地毯’和‘多项式输出’。铺地毯问题讨论了两种解决方法,一是直接赋值输出,二是比较坐标范围。多项式输出题需要注意x的一次方的正确输出。博客还提及了‘机器翻译’题目,作者通过模拟解决了问题,但对比dalao的解法感到自己的方法较为复杂。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所谓模拟就是根据题意直接编写,思维简单。

p1003——铺地毯

铺地毯的方法有两种,一种是输入同时给二维数组赋值(值为地毯的数),最后直接输出坐标的二维数组的值。
第二种首先将数据输入保存在二维数组里,用所求坐标从最后开始比较所求坐标是否在地毯范围内,最后如果没有输出就输出-1。

//第二种方法
#include<bits/stdc++.h>
using namespace std;
int shuzu[10005][5];
int main()
{
	int n,x,y;
	cin>>n;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=4;++j){
			cin>>shuzu[i][j];
		}
	}
	cin>>x>>y;
	bool flag=false;
	for(int k=n;k>0;--k){
		if((shuzu[k][1]<=x)&&(shuzu[k][3]+shuzu[k][1]>=x)&&(shuzu[k][2]<=y)&&(shuzu[k][2]+shuzu[k][4]>=y)){
		cout<<k;
		break;	
		}
		if(k==1) cout<<-1; 
	}
	return 0;
}
多项式输出

这道题考虑的情况多一点,但是不难。
注意x的一次方,输出x而不是x^1。

#include<bits/stdc++.h>
using namespace std;
int arr[1005];
int main()
{
	int n;
	cin>>n;
	for(int i=n;i>=0;--i){
		cin>>arr[i];
	}
	for(int j=n;j>=0;--j){
		if(j==0){
			if(arr[j]>0) printf("+%d",arr[j]);
			else if(arr[j]<0) printf("%d",arr[j]);
		}
		else if(j==1){
			if(arr[j]>0){
				if(j!=n) printf("+");
				if(arr[j]==1) printf("x");
				else printf("%dx",arr[j]);
			}
			else if(arr[j]==0) continue;
			else{
				if(arr[j]==-1) printf("-x");
				else printf("%dx",arr[j]);
			}
		}
		else{
			if(arr[j]>0){
				if(j!=n) printf("+");
				if(arr[j]==1) printf("x^%d",j);
				else printf("%dx^%d",arr[j],j);
			}
			else if(arr[j]==0) continue;
			else{
				if(arr[j]==-1) printf("-x^%d",j);
				else printf("%dx^%d",arr[j],j);
			}
		} 
	}
	return 0;
}
机器翻译

不得不说,大佬真的多,这道题我用的方法是纯模拟,纯模拟的做法很麻烦,复杂度很高,看了洛谷dalao题解,觉得自己的方法真的菜,所以我还是解释dalao的做法.

#include<bits/stdc++.h>
using namespace std;
int main()
{//设两个数组,一个记录字典中是否含有某个内容,一个记录字典开头位置。
	int n,m,l,r,x,a[1005]={0},b[1005]={0};
	int ans=0; 
	l=0;r=0;
	cin>>m>>n;
	for(int i=1;i<=n;++i){
		scanf("%d",&x);//边读入边处理 
		if(a[x]==0){//当输入的数字不在字典中时 
			ans++;//不在字典搜索一次 
			r++;//表示第几次搜索 
			b[r]=x;//数组储存第r次搜索的内容 
			a[x]=1;//被搜索的内容存入字典 
			if(r>m) {//如果内存超出了 
				l++;//移动字典开头的位置 
				a[b[l]]=0;//将该移出字典的内容移出
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值