div2 699 b c

       这道题可以说是很简单的,但我就是想不出来,脑子迷糊了,很简单的一道暴力题

思路:暴力循环(因为山有100座)O(n2)可做;对每个石头遍历,遇到过不去的就山高度加一,然后从下一个石头开始,如果遇到可以通过全部山,就标记为1

 

代码如下:  

#include<iostream>

using namespace std;
const int maxn=1e4;
int a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{

int flag=0;
int d;
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=k;i++)
{
for(int j=1;j<=n;j++)
{
if(a[j]<a[j+1]&&j<n)
{
a[j]++;
d=j;
break;
}
if(j==n) flag=1;
}
if(flag==1) break;
}
if(flag==1) cout<<"-1"<<endl;
else cout<<d<<endl;
}
return 0;
}

 

c:这道题我们细细想来,会发现如果c数组里的最后一个在b数组里没有出现,那么无论怎样都不可能成功,因为对于没有出现在b数组里的颜色可以将它涂到下一个在b数组里出现的颜色位置上,

   然后下一个出现的颜色可以覆盖这个没有的颜色。如果c数组里最后一个没有在b数组里出现就不可能覆盖。

然后对于涂改次序我们可以倒序c数组遍历,这样就可以实现覆盖。

代码如下:

 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1e5+100;
int a[maxn],b[maxn],c[maxn];
vector<int>v[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)    cin>>a[i];
        for(int i=1;i<=n;i++)    cin>>b[i];    
        for(int i=1;i<=m;i++) cin>>c[i];
         int flag=0;
         for(int i=1;i<=n;i++)
         if(b[i]==c[m])  flag=i;
        /*     int cnt=0;
    for(int i=1;i<=n;i++)
     if(a[i]!=b[i])   
            {
                v[b[i]].push_back(i);cnt++;
            }这些代码不能写在这个if语句之前,因为写了如果vector里存了东西,continue执行了这些vector将不会被清空*/ 
        if(flag==0) 
        {
            cout<<"NO"<<endl;
            continue;
        }
        int cnt=0;
       for(int i=1;i<=n;i++)
        if(a[i]!=b[i])   
            {
                v[b[i]].push_back(i);cnt++;
            }
        vector<int> ans;
        for(int i=m;i>=1;i--)
        {
            if(v[c[i]].size()==0)
            {
                if(i==m)  ans.push_back(flag);
                else ans.push_back(ans[0]);
                continue;
            }
            ans.push_back(v[c[i]].back());
            v[c[i]].pop_back();
            cnt--;
        }
        if(cnt)   cout<<"NO"<<endl;
        else 
        {
            cout<<"YES"<<endl;
            reverse(ans.begin(),ans.end());
            vector<int>::iterator it=ans.begin();
            for(;it!=ans.end();it++)
            cout<<*it<<" "; 
            cout<<endl; 
        }
        for(int i=1;i<=n;i++) v[i].clear();
    }
    return 0;
}

 

posted on 2021-02-07 17:59  ql2013  阅读(61)  评论(0)    收藏  举报

导航