所谓模拟就是根据题意直接编写,思维简单。
铺地毯的方法有两种,一种是输入同时给二维数组赋值(值为地毯的数),最后直接输出坐标的二维数组的值。
第二种首先将数据输入保存在二维数组里,用所求坐标从最后开始比较所求坐标是否在地毯范围内,最后如果没有输出就输出-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;
}