基础训练(4)
1.
可以发现边界必须连边,然后就考虑对边界连边,发现最多连四条边,如果都是边界连接边界就是两条边。所以就直接考虑总共连接2,3,4条边。
const int N=2e5+100;
int n;
int a[N],b[N];
void slove(){
cin>>n;
fel(i,1,n) cin>>a[i];
fel(i,1,n) cin>>b[i];
int t1,t2,t3,t4;
t1=t2=t3=t4=1e18;
fel(i,1,n){
t1=min( t1, abs(a[1]-b[i]) );
t2=min( t2, abs(a[n]-b[i]) );
t3=min( t3, abs(b[1]-a[i]) );
t4=min( t4, abs(b[n]-a[i]) );
}
int ans=1e18;
ans=min({
abs(a[1]-b[1])+abs(a[n]-b[n]),
abs(a[1]-b[n])+abs(a[n]-b[1]),
abs(a[1]-b[1])+t2+t4,
abs(a[1]-b[n])+t2+t3,
abs(a[n]-b[1])+t1+t4,
abs(a[n]-b[n])+t1+t3,
t1+t2+t3+t4
});
cout<<ans<<endl;
}
2.
wa了两发,后面发现只有在n/2+1的区间内可以找到一个满足条件的字母就只需要一次了。
void slove(){
cin>>n>>op;
cin>>s;
s=" "+s;
int pos=0,cnt=0;
for(int i=n/2+1;i<=n;i++){
if(s[i]==op){
pos=i;
break;
}
}
for(int i=1;i<n;i++){
if(s[i]!=op){
cnt++;
break;
}
}
if(cnt==0&&s[n]==op){
cout<<0<<endl;
}
else if(pos){
cout<<1<<endl;
cout<<pos<<endl;
}
else{
if(cnt==1&&s[n]==op){
cout<<1<<endl;
cout<<n<<endl;
}
else if(cnt==1&&s[n]!=op){
cout<<2<<endl;
cout<<n-1<<" "<<n<<endl;
}
}
}
3.
2200分的题其实思维难度不算高。首先新矩阵必须对应是前面矩阵的倍数,原矩阵1-16的值域。我可以考虑直接求他们的lcm。然后又因为相邻格子之间差位k的四次方。发现需要加四次方的格子一定是间隔的。所以直接考虑这些格子直接加上原矩阵对应点的四次方即可。
void slove(){
cin>>n>>m;
int lcm=1;
for(int i=2;i<=16;i++){
lcm=lcm*i/__gcd(lcm,i);
}
fel(i,1,n){
fel(j,1,m){
cin>>mp[i][j];
}
}
fel(i,1,n){
fel(j,1,m){
if((i+j)&1) cout<<lcm<<" ";
else cout<<lcm+pow(mp[i][j],4)<<" ";
}
cout<<endl;
}
}
4.
就是求a / b =a % b的对数。发现a / b = a % b = i你是很容易求出来多少对的。1 <= i < y
此时只需要判断确定b就可以确定a了,所以就直接确定符合条件的b有多少个。b的最小值和最大值都很好确定。
void slove(){
cin>>a>>b;
int ans=0;
for(int i=1;i<b;i++){
if(i*(i+2)>a) break;
int t1=i+1;
int t2=min(a/i-1,b);
ans+=t2-t1+1;
}
cout<<ans<<endl;
}
5.
很明显每个人可以进行的比赛场出是可以确定的都是n-1场,要使平局尽量少。那就显而易见了。n-1是偶数就一半win一般lose。奇数就多一把平局即可。
void slove(){
cin>>n;
fel(i,1,n) sum[i]=vis[i]=0;
if(n%2){
int cnt=(n-1)/2;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(sum[i]<cnt){
cout<<1<<" ";
sum[i]++;
}
else{
cout<<-1<<" ";
sum[j]++;
}
}
}
cout<<endl;
}
else{
int cnt=(n-1)/2;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(sum[i]<cnt){
cout<<1<<" ";
sum[i]++;
}
else if(sum[i]==cnt&&vis[i]==0){