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; }
浙公网安备 33010602011771号