A题
B:对于每个d>=i>=-d枚举,取可以满足在剩余的时间内可以达到v2的最大值。即贪心法则。。
C:先求出上限(除了自己之外,其他至少为1时)Max,因为数据为10^5,所以预先处理出sum[i],前i项和。这样对于每个取下限的时候,可由tot和sum[]算出。
D:先从0开始,若当前的值>=3,但是在序列中找不到,则只能-3,也就是说只会出现握手的人数+1和握手的人数-3这两种情况。若还是找不到,则输出impossible。
有很多可行的构造方法,我是采取的对于每个数 i 和 i+n/2配对的方式。对于4特别处理,为2 4 1 3
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
cin>>n;
if(n==1)
{
cout<<1<<endl;
cout<<1<<endl;
}
else if(n==2)
{
cout<<1<<endl;
cout<<1<<endl;
}
else if(n==3)
{
cout<<2<<endl;
cout<<"1 3"<<endl;
}
else if(n==4)
{
cout<<4<<endl;
cout<<"2 4 1 3"<<endl;
}
else
{
if(n%2==0)
{
cout<<n<<endl;
cout<<1<<" "<<1+n/2;
for(int i=2;i<=n/2;i++)
cout<<" "<<i<<" "<<i+n/2;
cout<<endl;
}
else
{
cout<<n<<endl;
for(int i=1;i<(n+1)/2;i++)
cout<<i<<" "<<i+(n+1)/2<<" ";
cout<<(n+1)/2;
cout<<endl;
}
}
}
B:对于每个d>=i>=-d枚举,取可以满足在剩余的时间内可以达到v2的最大值。即贪心法则。。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int v1,v2;
int t,d,sum;
int main()
{
cin>>v1>>v2>>t>>d;
if(v2 < v1)
swap(v1,v2);
sum=v1;
for(int i=2;i<=t;i++)
{
for(int j=d;j>=-d;j--)
{
if(v1+j-(t-i)*d<=v2)
{
v1+=j;
break;
}
}
sum+=v1;
}
cout<<sum<<endl;
return 0;
}
C:先求出上限(除了自己之外,其他至少为1时)Max,因为数据为10^5,所以预先处理出sum[i],前i项和。这样对于每个取下限的时候,可由tot和sum[]算出。
注意下限temp<0的情况特殊处理一下。
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
long long sum[200004];
long long s[200004];
int main()
{
long long n,tot;
cin>>n>>tot;
long long k=tot-(n-1);
sum[0]=0;
for(long long i=1;i<=n;i++)
{
cin>>s[i];
if(s[i]>=k)
sum[i]=sum[i-1]+k;
else
sum[i]=sum[i-1]+s[i];
}
long long first=0;
for(long long i=1;i<=n;i++)
{
long long ans=0;
if(s[i]>k)
ans+=(s[i]-k);
long long temp=tot-(sum[n]-(sum[i]-sum[i-1]));
if(temp-1<=0)
temp=1;
ans+=min(temp-1,s[i]);
if(first++)
cout<<" ";
cout<<ans;
}
cout<<endl;
}
D:先从0开始,若当前的值>=3,但是在序列中找不到,则只能-3,也就是说只会出现握手的人数+1和握手的人数-3这两种情况。若还是找不到,则输出impossible。
#include<iostream>
#include<string>
#include<queue>
using namespace std;
queue<int> q[200005];
int res[200005];
int main()
{
int n,num;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num;
q[num].push(i);
}
int cur=0;
for(int i=1;i<=n;i++)
{
while(q[cur].empty()&&cur>=3)
cur-=3;
while(q[cur].empty())
{
cout<<"Impossible"<<endl;
return 0;
}
int temp=q[cur].front();
q[cur].pop();
res[i]=temp;
cur++;
}
int first=0;
cout<<"Possible"<<endl;
for(int i=1;i<=n;i++)
{
if(first++)
cout<<" ";
cout<<res[i];
}
cout<<endl;
}