VP情况 4 / 8
AC: A,B,D,E1 60 minutes
WA: C
4 | 127 | +00:02 | +00:28 | -7 | +00:58 | +00:39 | |
手速还在线
D pair排个序,
分类讨论
- 个人最多的聚会>=其余n-1 人的聚会,这里答案就很清楚了
- 个人最多的聚会<其余n-1 人的聚会,将编号加入新数组里,
数组下标,1~n/2 ~ n,这里就输出a[1~n/2],a[n/2+1~n]为答案
感觉这里和某A题一样。
// AC one more times
bool cmp1(PII c, PII d) { return c.fi > d.fi; }
void solve()
{
int n; cin>>n;
vector<PII> a;
for(int i=1;i<=n;i++)
{
int x; cin>>x;
if(x==0) continue;
else
a.push_back({x,i});
}
sort(a.begin(),a.end(),cmp1);
int len=a.size(),sum=0;
for(int i=1;i<len;i++)
sum+=a[i].fi;
if(a[0].fi>=sum)
{
cout<<sum<<endl;
for(int i=1;i<len;i++)
while(a[i].fi--)
cout<<a[0].se<<" "<<a[i].se<<endl;
}
else
{
vector<int> b;
for(auto it : a)
{
int ti=it.fi,na=it.se;
while(ti--)
{
b.push_back(na);
}
}
sort(b.begin(),b.end());
cout<<b.size()/2<<endl;
int f=b.size()/2-1,f2=b.size()-1;
for(int i=f;i>=0;i--)
{
cout<<b[i]<<" "<<b[f2]<<endl;
f2--;
}
}
return;
}
int main()
{
std::ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
int T;cin>>T;for(int i=1;i<=T;i++)
solve();
return 0;
}
B模拟,先确定大的数,通过左移到位置上,n-1次操作就能完成。
// AC one more times
struct ans
{
int l,r,d;
};
void solve()
{
ans res[55];
int cnt=0;
int n; LL a[55];
cin>>n;
LL b[55];
for(int i=1;i<=n;i++)
{
cin>>a[i]; b[i]=a[i];
}
sort(b+1,b+1+n);
for(int i=n;i>=2;i--)
{
LL t=b[i];
for(int j=i;j>=1;j--)
{
if(a[j]==t&&i==j) break;
if(a[j]==t&&i!=j)
{
res[++cnt]={1,i,j};
int times=j;
while(times--)
{
LL q=a[1];
for(int k=2;k<=i;k++)
a[k-1]=a[k];
a[i]=q;
}
break;
}
}
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++)
cout<<res[i].l<<" "<<res[i].r<<" "<<res[i].d<<endl;
return;
}
int main()
{
std::ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
int T;cin>>T;for(int i=1;i<=T;i++)
solve();
return 0;
}
E1 按字典序加入双端队列就出来了
C假题了,一直没有调出来wa2
正确作法是找点 '* '从左上和右上方向遍历,记录路径长度,直到其中有一方超出边界或者点不为 '*',终止。如果路径长度大于等于d就将路径上的每个点标记值++
最后check ,如果有点为 '*'但标记值为0就说明不符合条件
细节见代码:
// AC one more times
int cnt, c[100][100],n,m,k;
char op[100][100];
bool st;
int d;
void search(int x,int y)
{
int t1x=x,t2x=x,t1y=y,t2y=y;
while(1)
{
int jishu=0;
t1x=t1x-1,t1y=t1y-1;
t2x=t2x-1,t2y=t2y+1;
if(t1x>=0&&t1x<n&&t1y>=0&&t1y<m)
if(op[t1x][t1y]=='*')
jishu++;
if(t2x>=0&&t2x<n&&t2y>=0&&t2y<m)
if(op[t2x][t2y]=='*')
jishu++;
if(jishu<2) break;
cnt++;
}
if(cnt>=k)
{
c[x][y]++;
t1x=t2x=x,t1y=t2y=y;
while(cnt--)
{
t1x=t1x-1,t1y=t1y-1;
t2x=t2x-1,t2y=t2y+1;
if(t1x>=0&&t1x<n&&t1y>=0&&t1y<m)
if(op[t1x][t1y]=='*')
c[t1x][t1y]++;
if(t2x>=0&&t2x<n&&t2y>=0&&t2y<m)
if(op[t2x][t2y]=='*')
c[t2x][t2y]++;
}
}
}
void solve()
{
cin>>n>>m>>k;
st=false; memset(c,0,sizeof c);
for(int i=0;i<n;i++) cin>>op[i];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if( op[i][j]=='*' &&
( i-1>=0 && j-1>=0 && j+1<m) )
{
cnt=0;
search(i,j);
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(op[i][j]=='*'&&c[i][j]<=0)
st=true;
else if(op[i][j]=='.'&&c[i][j]>=1)
st=true;
if(st)
cout<<"NO"<<endl;
else cout<<"YES"<<endl;
return;
}
int main()
{
std::ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
int T;cin>>T;for(int i=1;i<=T;i++)
solve();
return 0;
}
本文来自博客园,作者:magicat,转载请注明原文链接:https://www.cnblogs.com/magicat/p/16535726.html