总结:晚上VP了一场,总共A了三题,主要卡在了C题上,A、B、C题都为思维题
A. Ian Visits Mary
思路:由于起点和终点的连线不经过格点且不需要最小化跳跃次数,所以可以走两个1*(a-1)和1*(b-1)的长方形
#include<iostream>
#define int long long
using namespace std;
signed main(){
int T;
cin>>T;
while(T--){
int a,b;
cin>>a>>b;
cout<<2<<'\n';
cout<<a-1<<' '<<1<<'\n';
cout<<a<<' '<<b<<'\n';
}
return 0;
}
B. Grid Reconstruction
12 2 10 4 8 6
1 7 3 9 5 11
思路:由于要最大化最小值,所以一个较大值两侧要相邻两个较小的值
#include<iostream>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
int r=2*n;
for(int i=1;i<=n;i++){
if(i%2){
cout<<r<<' ';
r-=2;
}else{
cout<<i<<' ';
}
}
r=(n+1);
cout<<'\n';
for(int i=1;i<=n;i++){
if(i%2){
cout<<i<<' ';
}else{
cout<<r<<' ';
r+=2;
}
}
cout<<'\n';
}
return 0;
}
C. Ian and Array Sorting
思路:基本就是找规律吧,第奇数个数和第偶数个数的位置可以相互交换,所以当数的个数为奇数时,一定可以构造出非递减序列,当数的个数为偶数时,可先将出最后一个数外都化为0,看最后一个数是否大于0,即可完成判断
#include<iostream>
#define int long long
using namespace std;
const int N=300005;
int a[N];
signed main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
a[i+1]-=a[i];
a[i]=0;
}
if(n%2||a[n]>=0){
cout<<"YES"<<'\n';
}else{
cout<<"NO"<<'\n';
}
}
return 0;
}