B. Cost of the Array
- \(n\ne k\)时答案不是1就是2,看了半小时才看出来,唉……
#include <bits/stdc++.h>
using namespace std;
int a[200005],h[200005];
long long s[200005];
int ask(int n,int k)
{
auto check=[](int x)
{
return s[x]-s[1]==x-1;
};
int p=partition_point(h+2,h+n+1,check)-h;
if(p<=n&&n-p>=k-2)
{
return 0;
}
else
{
return 1;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
h[i]=i;
cin>>a[i];
s[i]=s[i-1]+a[i];
}
if(n==k)
{
int ans=n/2+1;
for(int i=2;i<=n;i+=2)
{
if(a[i]!=i/2)
{
ans=i/2;
break;
}
}
cout<<ans<<"\n";
}
else if(ask(n,k)==0)
{
cout<<1<<"\n";
}
else
{
cout<<2<<"\n";
}
}
return 0;
}
C. Customer Service
- 假设这道题的条件没那么特殊,我觉得你也应该看出来这是一个【匹配】模型
#include <bits/stdc++.h>
using namespace std;
int a[305][305],p[305];
long long s[305][305];
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
reverse(a[i]+1,a[i]+n+1);
p[i]=0;
for(int j=1;j<=n;j++)
{
s[i][j]=s[i][j-1]+a[i][j];
if(s[i][j]==j)
{
p[i]++;
}
else
{
break;
}
}
q.push(p[i]);
}
int ans=0;
while(q.size())
{
int n1=q.top();
q.pop();
if(n1>=ans)
{
ans++;
}
}
cout<<ans<<"\n";
}
return 0;
}
D. Graph and Graph
- 这最短路模型也挺显然吧……还是在纸上推了一会儿才发现,或许是因为不太自信?
#include <bits/stdc++.h>
using namespace std;
vector<int>a1[1005],a2[1005];
bool b[1005][1005];
int n,d[1000005];
bool h[1000005];
typedef pair<int,int> c;
priority_queue<c,vector<c>,greater<c> >q;
void dijkstra(int s)
{
while(q.size())
{
q.pop();
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
d[i*1000+j]=INT_MAX;
}
}
d[s]=0;
q.push(make_pair(0,s));
while(q.size())
{
int n0=q.top().second;
if(q.top().first!=d[n0])
{
q.pop();
continue;
}
int n1=n0/1000,n2=n0%1000;
if(n1==n2&&h[n1]==true)
{
cout<<q.top().first<<"\n";
return;
}
q.pop();
for(int i=0;i<a1[n1].size();i++)
{
for(int j=0;j<a2[n2].size();j++)
{
int t0,t1=a1[n1][i],t2=a2[n2][j];
t0=t1*1000+t2;
if(d[n0]+abs(t1-t2)<d[t0])
{
d[t0]=d[n0]+abs(t1-t2);
q.push(make_pair(d[t0],t0));
}
}
}
}
cout<<-1<<"\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int s1,s2;
cin>>n>>s1>>s2;
for(int i=0;i<n;i++)
{
h[i]=false;
a1[i].clear();
a2[i].clear();
for(int j=0;j<n;j++)
{
b[i][j]=false;
}
}
s1--;
s2--;
int m1,m2;
cin>>m1;
for(int i=1;i<=m1;i++)
{
int u,v;
cin>>u>>v;
u--;
v--;
a1[u].push_back(v);
a1[v].push_back(u);
b[u][v]=b[v][u]=true;
}
cin>>m2;
for(int i=1;i<=m2;i++)
{
int u,v;
cin>>u>>v;
u--;
v--;
a2[u].push_back(v);
a2[v].push_back(u);
if(b[u][v]==true)
{
h[u]=h[v]=true;
}
}
dijkstra(s1*1000+s2);
}
return 0;
}