A题
有很多可行的构造方法,我是采取的对于每个数 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; }
E:等待更新
时间: 2025-01-01 05:15:59