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

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

p1003——铺地毯

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

//第二种方法
#include
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
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
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;
}

你可能感兴趣的:(洛谷)