5.18晚VP,共AC三题,ABC题,感觉难度还是挺大的,做起来一点也不顺手。。。A题秒出,卡在了B题,在B题花费了好多时间,还没有C题做得顺利。。。B题开始想错了,思路不对,但确实也是之前没有遇到过这种题。。。D题还没有读懂。。。
A. Divisible Array
思路:思维题
就是找规律吧,题目对ai和n都有要求,这点要注意到!!!其实只要输出当前下标的2倍即可。。。还有一种思路,第i个数输出i,因为第一个数可以输出任意数都可被1整除,所以加上第一个数使所有的数的和能被n整除即可
#include<iostream>
using namespace std;
int main(){
int T,n;
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++){
cout<<2*i<<' ';
}
cout<<'\n';
}
return 0;
}
B. Permutation Swap
思路:思维吧算是,一开始确实想错了,如果两个数交换,每个数移动的距离都是k即两个数距离的倍数,所以求当前位置的数和本来应该在的位置的距离的最大公因数即可
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int T,n,a,ans;
cin>>T;
while(T--){
ans=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a;
ans=__gcd(ans,abs(a-i));
}
cout<<ans<<'\n';
}
}
C. Counting Orders
思路:sort+二分
自己写的复杂度挺高的,本以为会超时,没想到竟然过了。。。算是排列组合问题吧,给数组从大到小b排序(因为b每选择一个数,比b小的数可选择的数的个数减1),找数组a中有几个比数组b中当前数大的数,然后比b小的数可选择的数的个数都减1,每个b可选择的数的个数相乘即为答案
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N=200005;
const int mod=1e9+7;
int a[N],b[N],c[N];
bool cmp(int x,int y){
return x>y;
}
signed main(){
int T,n,ans;
bool f;
cin>>T;
while(T--){
cin>>n;
ans=1;f=0;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
sort(a+1,a+1+n);
sort(b+1,b+1+n,cmp);
for(int i=1;i<=n;i++){
c[i]=n-(upper_bound(a+1,a+1+n,b[i])-a)+1;
ans=ans%mod*(c[i]-i+1)%mod;
if(c[i]<=0){
f=1;
break;
}
}
if(f){
cout<<0<<'\n';
}else{
cout<<ans%mod<<'\n';
}
}
return 0;
}
D1. Range Sorting (Easy Version)
啊啊啊没法入手。。。。