A. Direction Change
分析
给一个n*m的矩阵,要从(1,1)处到达(n,m)处。每次不能向同一个方向移动两次,问最小的移动次数。
最小移动次数,所以每次都向下移动一次后向右移动一次,直到有一个方向碰壁。这个时候就只能蛇形走,然后判断奇偶,输出结果。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+10;
const ll N=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
ll ans=0;
if(n==m||m==n+1||n==m+1)
{
ans=n+m-2;
cout<<ans<<endl;
continue;
}
if((n==1&&m!=2)||(n!=2&&m==1))
{
cout<<-1<<endl;
continue;
}
int tt;
if(n>m)
{
ans=m-1+m-2;
// cout<<ans<<" ";
tt=n-m;
// cout<<tt<<" ";
if(tt%2)
{
ans=ans+n-m+n-m;
// cout<<"1 ";
// cout<<ans<<endl;
}
else ans=ans+n-m+1+n-m;//,cout<<"11 "<<ans<<endl;
}
else {
ans=n-1+n-2;
tt=m-n;
if(tt%2)
{
ans=ans+m-n+m-n;
}
else ans=ans+m-n+1+m-n;
}
cout<<ans<<endl;
}
return 0;
}
B. Social Distance
分析
n个人,m把椅子,a[i]表示第i个人左右有a[i]把椅子不能坐人,椅子围成圈,判断是否可以这样安排坐人。
先对数组a排序,两个人之间用后面的人需要的空椅子数安排(前面肯定小于等于后面,这样就可以直接满足前面的要求)第一个人和最后一个人之间的距离特殊判断。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+10;
const ll N=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[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];
}
sort(a+1,a+n+1);
int i;
m--;
for(i=2;i<=n;i++)
{
if(m<0) break;
m-=a[i];
m--;
// cout<<m<<" ";
}
//cout<<i<<endl;
if(m>=a[n]&&i==n+1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
C. Make it Increasing
分析
对数组b可以进行的操作,最后使数组b严格递增,求最小操作次数
因为数据非常小,而且时间给出2s,所以我们采用暴力枚举b数组中每个0的位置,看哪个位置为0这样下来的操作数最小。
注意:数很大,该开long long的要开!!!明明思路正确因为一个long long卡真的很亏555
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=5e3+10;
const ll mod=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
ll a[maxn],b[maxn];
int main()
{
int n;
cin>>n;
ll ans=5e18;
ll tmp=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
if(i==1||i==n) tmp=1;
else tmp=2;
b[i]=0;
b[i-1]=a[i-1];
b[i+1]=a[i+1];
for(int j=i-1;j>1;j--)
{
ll tt=(b[j]+1+a[j-1]-1)/a[j-1];
b[j-1]=a[j-1]*tt;
tmp+=tt;
}
for(int j=i+1;j<n;j++)
{
ll tt=(b[j]+1+a[j+1]-1)/a[j+1];
b[j+1]=a[j+1]*tt;
tmp+=tt;
}
ans=min(ans,tmp);
/* cout<<i<<" "<<tmp<<endl;
for(int i=1;i<=n;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;*/
}
cout<<ans<<endl;
return 0;
}