洛谷 模拟题

1.铺地毯

这道题一直WA?,最后看了题解终于过了

#include 
using namespace std;
typedef long long ll;
const int MA=10005;
int n;
int a[MA][4];
int main()
{
    memset(a,0,sizeof(a));
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3];//a,b,g,k;
        a[i][3]+=a[i][1];
        a[i][2]+=a[i][0];
    }
    int x,y;
    cin>>x>>y;
    for(int i=n-1;i>=0;--i){
        if(a[i][0]<=x&&a[i][2]>=x&&a[i][1]<=y&&a[i][3]>y){
            cout<<i+1<<endl;
            return 0;
        }
    }
    cout<<"-1"<<endl;
    return 0;
}

2.

好烦的一道题,要考虑很多问题,看完下面dalao的代码,感觉自己做题思路很乱,应该先仔细思考这道题,如何处理各个问题,而不是直接上手写;?

#include 
using namespace std;
typedef long long ll;
const int MA=10005;
int a[MA],b[MA];
int n;
int main()
{
    ios_base::sync_with_stdio();
    cin>>n;
    int t=0,s=0,e=n;
    for(int i=0;i<=n;++i){
        cin>>a[i];
        if(!t&&a[i]){
            s=i;
            t=1;
        }
        if(n-i==0){
            e=i;
        }
        if(a[i]==1)b[i]=1;
        else if(a[i]==-1)b[i]=2;
        else if(a[i]>0)b[i]=3;
        else if(a[i]<0)b[i]=4;
        else b[i]=0;
    }
    for(int i=s;i<=n;++i){
        if(i==e){
           if(a[i]>0)printf("+%d",a[i]);
           else if(a[i]<0)printf("%d",a[i]);
           break;
        }
        switch(b[i])
        {
          case 1:{
              if(i==s&&n-i==1)printf("x");
              else if(n-i==1)printf("+x");
              else if(i==s)printf("x^%d",n-i);
              else printf("+x^%d",n-i);
          }break;
          case 2:{
              if(n-i!=1)printf("-x^%d",n-i);
              else printf("-x");
          }break;
          case 3:{
              if(i==s&&n-i==1)printf("%dx",a[i]);
              else if(n-i==1)printf("+%dx",a[i]);
              else if(i==s)printf("%dx^%d",a[i],n-i);
              else printf("+%dx^%d",a[i],n-i);
          }break;
          case 4:{
              if(n-i==1)printf("%dx",a[i]);
              else printf("%dx^%d",a[i],n-i);
          }break;
          default:break;
        }
    }
    cout<<endl;
    return 0;
}

看到了大佬的代码,Orz

#include
using namespace std;
int main(){
    int n,a;
    cin>>n;
    for(int i=n;i>=0;i--){
        cin>>a;
        if(a){0系数
            if(i!=n&&a>0)cout<<"+";    根据正负、是否为最高此项决定加号
            if(abs(a)>1||i==0)cout<<a;    输出系数(系数不为正负1或指数为0if(a==-1&&i)cout<<"-";    -1系数特判,常数项已特判
            if(i>1)cout<<"x^"<<i;    二次及以上输出指数
            if(i==1)cout<<"x";    一次项
        }
    }
}

3.机器翻译

读题时读到 “ 软件会清空最早进入内存的那个单词 ” 就觉得可以用队列。

#include
#include 
#include 
using namespace std;
const int MA=10005;
bool vis[MA];
int main()
{
  ios_base::sync_with_stdio();
  int M,N,a,sum=0;
  cin>>M>>N;
  queue<int> q;
  for(int i=0;i<N;++i){
    cin>>a;
    if(!vis[a]){
       q.push(a);
       vis[a]=true;
       sum++;
       if(q.size() > M) {
        vis[q.front()]=false;
        q.pop();
       }
    }
  }
  cout<<sum<<endl;
  return 0;
}

你可能感兴趣的:(ACM)