在发现顺序错误之后 、, rk2 (rk1 qzh太(chao)强(ti)了(jie) )
而lzz的题解非常诡异,竟然要用gcd 、’
而我似乎暴力枚举就过了(注意操作顺序,不要太自信)、
#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,q,i,ans,T;
int main()
{
freopen("simple.in","r",stdin);
freopen("simple.out","w",stdout);
scanf("%lld",&T);
while(T--)
{
ans=0;
scanf("%lld%lld%lld",&n,&m,&q);
if(n>m)swap(n,m);
for(i=0;i<=q/m;i++)
{
if(i>0&&m*i%n==0)break;
if(i>0) ans++;
ans+=((q-i*m)/n);
}//完了
printf("%lld\n",q-ans);
}
}
一脸不可做
只打了45 因为一开始少想了跳到右边、、
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 200005
#define ll long long
ll x[N],n,l,s,i,ans,daan,ans2=999999999999999,bla[N];
bool zg[N],zg2[N];
#include<queue>
priority_queue< ll,vector<ll>,greater<ll> >q;
struct la
{
ll v,id;
}a[N];
bool cmp(la q,la p)
{
return q.v<p.v;
}
int main()
{
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
scanf("%lld%lld%lld",&n,&l,&s);
zg[s]=1;
for(i=1;i<=n;i++)
{
scanf("%lld",&x[i]);
}
ans+=x[n]-x[1];
ans+=(x[s]-x[1]);//开始时左移花费
if(l==0) //l==0特判
{
if(s!=1) printf("-1\n");
else
{
printf("%lld\n",ans);
for(i=2;i<=n;i++)
printf("%lld ",i);
}
return 0;
}
if(l>=s-1)//特判2
{zg2[s]=1;
bool fh=0;
ans2=x[n]-x[1]+x[n]-x[s];
int qi=l+2;
for(i=1;i<n;i++)
{
bla[i]=qi;
zg2[qi]=1;
if(qi==n)fh=1;
if(fh==0)qi++;
else
{
qi--;
while(zg2[qi]==1)qi--;
}
}
} else
{
ans2=x[n]-x[s]+x[n]-x[1]+x[s-l]-x[1];
int tot=0;
for(int j=s+1;j<=n;j++)
bla[++tot]=j;
for(int j=s-1;j>s-l;j--)bla[++tot]=j;
bla[++tot]=1;
for(int j=2;j<=s-l;j++)
bla[++tot]=j;
}
if(l-(s-1)<=0)//l左边用完特判
{ if(ans>ans2)
{
printf("%lld\n",ans2);
for(int j=1;j<n;j++)
printf("%lld ",bla[j]);
return 0;
}
printf("%lld\n",ans);
ll lin=s;
while(l!=1)
{
lin--;
l--;
printf("%lld ",lin);
zg[lin]=1;
}
printf("1 ");
zg[1]=1;
for(i=1;i<=n;i++)
if(zg[i]==0)printf("%lld ",i);
return 0;
}
for(i=1;i<=s;i++)
zg[i]=1;
l-=(s-1);
if(l>n-s-1)
{
printf("-1\n");
return 0;
}
ll xh=l;
daan=ans+x[n]-x[n-l];
for(i=s+2;i<n-l;i++)
q.push(x[i]-x[i-1]);
ll lin=i;
for(i=l-1;i>=0;i--)
{
q.push(x[lin]-x[lin-1]);
ans+=q.top()*2;
q.pop();
ans-=(x[n-i]-x[n-i-1]);
if(ans<daan)
{
ans=daan;
xh=i;
}
} if(daan>ans2)
{
printf("%lld\n",ans2);
for(int j=1;j<n;j++)
printf("%lld ",bla[j]);
return 0;
}
printf("%lld\n",daan);
for(i=s-1;i>=1;i--)
printf("%lld ",i);
for(i=s+2;i<=n;i++)
{
a[i].id=i;
a[i].v=x[i]-x[i-1];
}
if(n-xh>=s+3)sort(a+s+3,a+n-xh,cmp);
for(i=s+2;i<s+2+l-xh;i++)
{
zg[a[i].id]=1;
}
int o=s+1;
while(1)
{
if(o>=n-xh)
{
for(i=n;i>=n-xh;i--)
printf("%lld ",i);
return 0;
}
int lin=o+1,u=o+1;
while(zg[lin])
{
lin++;
u++;
}
lin--;
while(lin>=o)
{
printf("%lld ",lin);
lin--;
}
o=u;
}
}