• 2022.01.15.更新D | L:数学找规律 | dfs(tle)->贪心模拟
  • 2022.01.14.更新L题:统计连通子图数模型,三解:dsu,bfs,dfs

文章目录

  • B - 这是一道方块题 [CodeForces 272C](https://vjudge.net/problem/CodeForces-272C/origin)
  • [E - 这是一道果果题](https://vjudge.net/problem/CodeForces-743B)[CodeForces - 743B ](https://vjudge.net/problem/CodeForces-743B/origin)
  • [G - 这是一道树林题](https://vjudge.net/problem/POJ-3090)[POJ - 3090](https://vjudge.net/problem/POJ-3090/origin)
  • [J - 这是一道猫咪题](https://vjudge.net/problem/CodeForces-1070D)[CodeForces - 1070D ](https://vjudge.net/problem/CodeForces-1070D/origin)
  • [L - 这是一道玩具题](https://vjudge.net/problem/CodeForces-1209D) [CodeForces - 1209D](https://vjudge.net/problem/CodeForces-1209D/origin)
  • [D - 这是一道算数题](https://vjudge.net/problem/Gym-104090D)[Gym - 104090D ](https://vjudge.net/problem/Gym-104090D/origin)
  • [K - 这是一道奶茶题](https://vjudge.net/problem/CodeForces-863B) [CodeForces - 863B ](https://vjudge.net/problem/CodeForces-863B/origin)

B - 这是一道方块题 CodeForces 272C

线段树模版题
Description

一天,公孙晚霁正在玩这款新型的俄罗斯方块游戏,游戏中一共有$ n $列空间,她将方块排列成了从左到右下方填满,依次增高的阶梯形状 第一列的高度为 a 1 a_1 a1​,第二列的高度为 a 2 a_2 a2​,…,第 n列的高度为 $ a_n (1≤a1≤a2≤…≤an)。$

这时,公孙英朗来给公孙晚霁捣乱了,他抢过了游戏手柄,将接下来的 mm 块方块都移动到最左侧,依次下落,第 i块方块的宽为 w i w_i wi​,高为 h i h_i hi​。请帮公孙晚霁计算一下,每块方块下落后,方块下边缘距离游戏场景底部的距离。

如图

Input

  • 列数n
  • 每列高度 a 1 , a 1 , . . . , a n {a1,a1,...,an} a1,a1,...,an
  • 新方块数m
  • 每个方块尺寸 w , h w,h w,h

Output

一共输出 mm 行,每行一个整数,表示方块落下后,下边缘距离游戏场景底部的距离。

Solution

线段树板子,每个方块下落时,落在区间最值 m a x n ( 1 : w ) maxn(1:w) maxn(1:w)位置,这个区间被赋新值 a ( 1 : w ) = m a x n + h a(1:w)=maxn+h a(1:w)=maxn+h

Code

#include<bits/stdc++.h>
using namespace std;
using ll=long long;const int N=1e5+5;ll a[N];
ll  d[N<<2]={0};
ll  tag[N<<2]={0};inline int     left(int i) { return i<<1; }
inline int  right(int i) { return i<<1|1; }
inline int  fa(int i) { return i>>1; }inline void push_up(int p)
{   //线段树维护区间最值d[p] = max(d[left(p)] , d[right(p)] );
}
inline void push_down(int l,int r,int p)
{if (!tag[p]) return;int mid = (l + r) >> 1;tag[left(p)] = tag[p];tag[right(p)] = tag[p];d[left(p)]  = tag[p];d[right(p)] = tag[p];tag[p] = 0;
}void build(int l,int r,int p)
{if(l==r) {d[p]=a[l];return; }int mid=(l+r)>>1;build(l,mid,left(p));build(mid+1,r,right(p));push_up(p);
}
ll query(int lo,int hi,int l,int r,int p)
{ll res=0;if(lo<=l && r<=hi) return d[p];int mid=(l+r)>>1;push_down(l,r,p);if(lo<=mid) res=max(res,query(lo,hi,l,mid,left(p)));if(hi>mid)  res=max(res,query(lo,hi,mid+1,r,right(p)));return res;
}
void update(int lo,int hi,int l,int r,int p,ll elm)
{//区间修改操作位区间赋值if(lo<=l && r<=hi){d[p]=elm;tag[p]=elm;return;}push_down(l,r,p);int mid = (l + r) >> 1;if (lo <= mid) update(lo, hi,   l  , mid, left(p),elm);if (hi > mid ) update(lo, hi, mid+1,  r , right(p),elm);push_up(p);
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}build(1,n,1);
//  for(int i=1,lvl=0;i<=4*n;lvl++) {for(int j=1;j<=1<<lvl;j++) cout<<d[i++]<<" "; cout<<'\n';}int m;cin>>m;while(m--){int w,h;cin>>w>>h;ll maxn=query(1,w,1,n,1);cout<<maxn<<'\n';update(1,w,1,n,1,maxn+h);}return 0;}

E - 这是一道果果题CodeForces - 743B

找规律
Description

公孙英朗给公孙晚霁买了很多果果,公孙晚霁很喜欢,但是为了她的减肥计划,她一天不能吃太多果果。
公孙晚霁的减肥计划由n步生成,生成过程如下:

根据这个过程,当n=1时,该计划进行一天,这天可以吃的果果数量为1。
当n=2时,该计划进行三天,这些天可以吃的果果数量为[1,2,1]。
当n=3时,该计划进行七天,这些天可以吃的果果数量为[1,2,1,3,1,2,1].请你帮公孙晚霁计算一下,依照该计划,第k天她能吃多少果果。

Input

1 ≤ n ≤ 50 , 1 ≤ k ≤ 2 50 − 1 1\le n \le 50,1\le k \le 2^{50} -1 1≤n≤50,1≤k≤250−1

Solution

这个序列为, { 1 1 , 2 2 , 1 3 , 3 4 , 1 5 , 2 6 , 1 7 , 4 8 , 1 9 , 2 10 , 1 11 , 3 12 , 1 13 , 2 14 , 1 15 , 5 16 , 1 , 2 , 1 , 3 , 1 , 2 , 1 , 4 , 1 , 2 , 1 , 3 , 1 , 2 , 1 , . . . } \{1_1,2_2,1_3,3_4,1_5,2_6,1_7,4_8,1_9,2_{10},1_{11},3_{12},1_{13},2_{14},1_{15},5_{16},1,2,1,3,1,2,1,4,1,2,1,3,1,2,1,...\} {11​,22​,13​,34​,15​,26​,17​,48​,19​,210​,111​,312​,113​,214​,115​,516​,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1,...}

可以观察出一些性质

tle递推式子

ll query(ll k)
{       ll bin=0;while( ( 1<<bin ) <= k) bin++; bin--;if(k==1<<bin) return bin+1;else return query(k-(1<<bin));    

这个bin是难求而重复的,tle了,如果通过map记忆化递归推lg,mle了

继续观察这个序列 1 , 2 , 1 , 3 , 1 , 2 , 1 , 4 , 1 , 2 , 1 , 3 , 1 , 2 , 1 {1,2,1,3,1,2,1,4,1,2,1,3,1,2,1} 1,2,1,3,1,2,1,4,1,2,1,3,1,2,1

1:  1 3 5 7 9 ,...   beg=2^0,del=2^1
2:  2 6 10 ,...       beg=2^1,del=2^2
3:  4 12 20 ,...      beg=2^2,del=2^3
4:  8 ,...            beg=2^3,del=2^4

根据这个来求就好了:减去beg,判是否整除del

Code

ll querr(ll n,ll k)
{for(ll i=1;i<=n+1;i++){ll tmp=k-(1ll*1<<(i-1));if(tmp%(1ll*1<<(i))==0) {return i;}}
}

G - 这是一道树林题POJ - 3090

欧拉筛模版题

学校里的小树林种成了一个 ( n + 1 ) ∗ ( n + 1 ) (n+1) * (n+1) (n+1)∗(n+1) 大小的密密麻麻的正方形矩阵,公孙英朗和公孙晚霁在树林里捉迷藏。
公孙英朗面朝树干,公孙晚霁躲了起来。3…2…1… 随后公孙英朗转头,开始捉公孙晚霁啦~

公孙英朗从 (0, 0) 的位置转头,公孙晚霁就藏在了这些树后边,因为树之间有遮挡关系,公孙英朗只能看见一部分树,请帮公孙晚霁计算一下,公孙英朗能看见多少树。

小树林中每一颗树都看做平面直角坐标系下的一个个点,从 (0, 0) 到 (n, n)都种满了树。当 n=5时,小树林的样子如下图所示:

当某点与 (0, 0的连线上有其它点时,该点会被连线上的点遮挡,公孙英朗就看不见这棵树了,如 (4, 2)这棵树会被 (2, 1)这棵树挡住,公孙英朗看不见位于 (4, 2) 的这课树。

Input

样例数T 1 ≤ T ≤ 1 e 3 1 \le T \le 1e3 1≤T≤1e3

矩阵规模n 1 ≤ n ≤ 1 e 3 1 \le n \le 1e3 1≤n≤1e3

Output

看见的树木cnt

Solution

对于起点为原点的射线,可由斜率唯一确定。

用map记录每一对 ( i , j ) (i,j) (i,j)的斜率,打表也能过,不优化是 O ( T n n l o g n ) O(Tnnlogn) O(Tnnlogn),T了

正解是欧拉函数板子。

欧 拉 函 数 : 小 于 等 于 n 的 与 n 互 质 的 正 整 数 的 个 数 欧拉函数:小于等于n的与n互质的正整数的个数 欧拉函数:小于等于n的与n互质的正整数的个数
φ ( n ) = { n − 1 , n 为 质 数 j ∗ φ [ i ] , i j = n , i % j = = 0 ( j − 1 ) ∗ φ [ i ] , i j = n \varphi(n)= \begin{cases} n-1&,n为质数\\ j * \varphi[i]&,ij=n,i\%j==0\\ (j-1) *\varphi[i]&,ij=n\\ \end{cases} φ(n)=⎩⎪⎨⎪⎧​n−1j∗φ[i](j−1)∗φ[i]​,n为质数,ij=n,i%j==0,ij=n​

矩阵左上角与右下角是对称的,考虑一半就好.

考查右下角三角形内任意数对 ( x , y ) ( 1 ≤ x ≤ y ) (x,y)(1\le x \le y) (x,y)(1≤x≤y)

其唯一确定斜率 k = y x k=\frac{y}{x} k=xy​,当 g c d ( x , y ) ! = 1 gcd(x,y)!=1 gcd(x,y)!=1时,这个斜率可由其左下角某个数对表示(成比例)

反之,当 g c d ( x , y ) = = 1 gcd(x,y)==1 gcd(x,y)==1时,即k不可再约,这个元素不重复

暨,给定 x = C x=C x=C,任取 1 ≤ y ≤ n 1\le y\le n 1≤y≤n,不重复的斜率 k = y x k=\frac{y}{x} k=xy​满足xy互质,这正是欧拉函数的定义

∴ a n s = 3 + 2 ∗ ∑ 2 n p h i [ i ] ans=3+2*\sum_2^n phi[i] ans=3+2∗∑2n​phi[i]

Code

void phis()
{phi[1]=1;for(int i=2;i<=N;i++){if(!vis[i]){prime[cnt++]=i;phi[i]=i-1;}for(int j=0;j<cnt && i*prime[j]<=N;j++){vis[prime[j]*i]=1;if(i%prime[j]==0){phi[i*prime[j]]=prime[j] * phi[i];break;}else phi[i*prime[j]]=(prime[j] -1 ) *phi[i]; }}
}
void solve(int n)
{ll ans=0;for(int i=2;i<=n;i++) ans+=phi[i];ans=ans*2+3;cout<<ans<<"\n";
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);phis();int T;cin>>T;for(int i=1;i<=T;i++){int n;cin>>n;cout<<i<<" "<<n<<" ";solve(n);}return 0;}

J - 这是一道猫咪题CodeForces - 1070D

小模拟
Description

公孙晚霁领养了一只学校里的流浪猫咪,并将给猫咪剪指甲这个工作交给了公孙英朗,让猫咪做公孙英朗的猫主子。

假设猫咪指甲的正常长度为一确定值,且当猫咪的指甲长度比正常长度长出长度为 k k k 时,可能会伤到别人,因此当猫咪的指甲达到$ 正常长度 +k$ 时就必须进行一次修剪猫咪的指甲长得很快,一个月之内可能进行多次修剪。为了保护猫咪,指甲不能被剪到正常长度以下,且晚霁认为猫咪当月长出的指甲必须在当月或下个月被剪掉。

已知猫咪当前的指甲长度为正常长度,接下来的 n n n个月中的第 i i i个月,猫咪指甲会增长的长度为$ a_i 。 ∗ ∗ 公 孙 英 朗 想 要 让 个 月 结 。**公孙英朗想要让个月结 。∗∗公孙英朗想要让个月结 n $束后,猫咪的指甲仍然为正常长度**。请计算公孙英朗最少需要修剪猫咪指甲的次数cnt。

正常长度=0

Input

第一行包含两个整数 n和k ( 1 ≤ n ≤ 2 ⋅ 1 0 5 , 1 ≤ k ≤ 1 0 9 (1 \le n \le 2\cdot10^5, 1 \le k \le 10^9 (1≤n≤2⋅105,1≤k≤109,表示月份的数量和指甲可以超出正常长度的最长长度。

第二行包含 nn 个整数 a_i ( 0 ≤ a i ≤ 1 0 9 ) (0 \le a_i \le 10^9) (0≤ai​≤109),表示第 i个月猫咪指甲的增长长度

:当猫爪长度逾k后,需立即修剪。

Solution

模拟

Code

#include<bits/stdc++.h>
using namespace std;
using ll=long long;const int N=1e5+5;int vis[N]={0};
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,m;cin>>n>>m;int cnt=0; for(int i=1;i<=m;i++){int x,y;cin>>x>>y;if(vis[x] && vis[y]){cout<<i<<' ';cnt++;}vis[x]=1;vis[y]=1;}cout<<cnt;return 0;}

L - 这是一道玩具题 CodeForces - 1209D

图论连通分量建模
Description

公孙晚霁和公孙英朗打算去孤儿院做志愿活动。第一次去之前,公孙晚霁准备了 nn 种玩具各一个,送给 mm 小朋友们玩。在这 nn 种玩具中,每个小朋友都有2种喜欢的玩具。分玩具的步骤为:

已知每个小朋友喜欢的玩具的种类。请帮公孙英朗计算伤心的小朋友最少有几个?

Input

玩具个数n,小朋友个数m

每个小朋友喜欢的玩具 x i , y i xi,yi xi,yi

Output

伤心的小朋友个数cnt

Solution

图论建模,将玩具建模为点,将小朋友建模为两点之间的边。对于一张有n个点的连通图,可以证明地是最多同时满足n-1个小朋友,即,策略是,按拓扑序加入n-1条边,所形成的最小生成树。此后所有点被链接,新边无法加入(sad people)

而题面所述的图可能是不连通的,求其连通分量数目即可。有bfs,dfs,dsu三种解法

A N S = M − ( n − c o u n t ( ) ) ANS=M-(n-count()) ANS=M−(n−count())

Code

边集数组存图,用并查集来维护连通分量:将连通的点放在同一个集合(共祖先)里,统计dsu映射中祖先的个数即可知集合的个数

#include<bits/stdc++.h>
using namespace std;
using ll=long long;// 连通分量问题:将玩具建模为点,将child建模为两点之间的边:每入一条边,其两端的点被vis。
//在一张n个点(玩具)m条边(child)的连通图中,通过适当的(拓扑序)读边,可以满足N-1个child。(生成树)
//考查本题所建模的图,可以是不连通而有若干连通分量的,用并查集来维护连通分量数。
const int N=1e5+5,M=2*N;
struct Edge{int from,to;
}edge[M];
int cnt_e=0;
void add(int u,int v)
{edge[++cnt_e].from=u;edge[cnt_e].to=v;
}
int n,m;
//dsu
int dsu[N]={0};
int find(int x) { return dsu[x]==x?x:dsu[x]=find(dsu[x]);}
void unite(int lhs,int rhs)
{dsu[find(rhs)]=find(lhs);
}int vis[N];
int count()
{int cnt=0;for(int i=1;i<=n;i++){if(!vis[find(i)]){vis[find(i)]=1;cnt++;}}return cnt;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++) dsu[i]=i;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;add(u,v);add(v,u);unite(u,v);}cout<<max(0,m-(n-count()));return 0;}

bfs 78 ms 2600 KB

链式前向星存图,每次bfs为访问过的边打上

#include<bits/stdc++.h>
using namespace std;
using ll=long long;// 连通分量问题:将玩具建模为点,将child建模为两点之间的边:每入一条边,其两端的点被vis。
//在一张n个点(玩具)m条边(child)的连通图中,通过适当的(拓扑序)读边,可以满足N-1个child。(生成树)
//考查本题所建模的图,可以是不连通而有若干连通分量的,用并查集来维护连通分量数。
const int N=1e5+5,M=2*N;
struct Edge{int to, nxt;
}edge[M];
int cnt_e=0;
int head[N]={0};
void add(int u,int v)
{edge[++cnt_e].to=v;edge[cnt_e].nxt=head[u];head[u]=cnt_e;
}
int n,m;
bool vis[N]={0};
int cnt=0;
void bfs(int beg)
{if(!vis[beg]) cnt++;queue<int> que;que.push(beg);while(!que.empty()){int u=que.front();que.pop();if(!vis[u]){vis[u]=1;for(int j=head[u];j;j=edge[j].nxt){int to=edge[j].to;if(!vis[to]){que.push(to);}}}}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;add(u,v);add(v,u);}for(int i=1;i<=n;i++) bfs(i);cout<<max(0,m-(n-cnt));return 0;}

dfs 同上 链式前向星存图 62 ms 5200 KB

void dfs(int u)
{if(vis[u]) return;vis[u]=1;for(int j=head[u];j;j=edge[j].nxt){int to=edge[j].to;if(!vis[to]) dfs(to);}
}
for(int i=1;i<=n;i++)
{if(!vis[i]){cnt++;dfs(i);}
}

效率比较

D - 这是一道算数题Gym - 104090D

awesome找规律

Description

公孙英朗的算数技能太差了,公孙晚霁决定给公孙英朗进行算数训练。
公孙晚霁准备了nn个整数,公孙英朗需要按顺序完成以下操作:

为了让公孙英朗表达对自己的爱意,公孙晚霁决定让他执行以上训练过程 520131 4 33441573 5201314^{33441573} 520131433441573轮。请帮公孙英朗计算出执行后的最终结果。

Solution

**打表看看每轮结果,最终结果会固定。**而while(1)等其固定会tle

再找找规律:
K = s u m / ( n + 1 ) a 1 = 2 K , a i = K K=sum/(n+1)\\ a1=2K,ai=K K=sum/(n+1)a1=2K,ai=K

1. 在减数和搬运的过程中,sum守恒,数列的总和从未改变

2. 基于若干次操作后,数列趋于稳定的事实:

3. 对于“将第i个数的一半搬运给第i+1个数”这个回圈的操作,2:1:1:1:1...这个比例满足稳定的需求。

将sum分为n+1份,a1占两份,其余占一份

Code

#include<bits/stdc++.h>
using namespace std;
using ll=long long;const int N=1e5+5;
int n;
double a[N];
int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);cout.tie(0);double sum=0;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];}double k=sum/(n+1);printf("%f ",2*k);for(int i=2;i<=n;i++) printf("%f ",k);
//    puts("");
//    double last=-1;
//    while(1)
//    {//
//      for(int i=1;i<n;i++)
//      {//          a[i]/=2;
//          a[i+1]+=a[i];
//      }
//      a[n]/=2;
//      a[1]+=a[n];
//      if(last==a[1])
//      {//          for(int i=1;i<=n;i++)printf("%f ",a[i]);
//          return 0;
//      }
//      last=a[1];
//
//  }return 0;}

K - 这是一道奶茶题 CodeForces - 863B

Description

公孙英朗打算请大家喝奶茶,于是他和公孙晚霁两人到奶茶店,下单了 2 n 2n 2n 杯不同的饮品。

由于购买了偶数杯,公孙晚霁本打算全部使用两杯装一起的方式打包带到 T 6023 T6023 T6023。但不幸的是,奶茶店仅剩了 n − 1 n-1 n−1 个两杯装袋子和若干一杯装袋子。于是公孙晚霁不得己决定使用全部的两杯装包装,再使用2个一杯装包装进行打包。

当使用两杯装包装时,公孙晚霁发现因为每杯重量不同,这些包装会产生不平衡值,若这两杯的重量分别为 u u u和 v v v,则不平衡值为$ abs(u-v)$。一杯装包装不产生不平衡值。

拎着奶茶的公孙英朗想让不平衡值的和尽可能小,请你求出该最小值。

Input

n , 1 ≤ n ≤ 50 n,1\le n\le 50 n,1≤n≤50

奶茶重量 { a 0 , a 1 , . . . , a 2 n } \{a0,a1,...,a2n\} {a0,a1,...,a2n}

Output

ans

人话

一个序列,选择两个数去掉,其他的自由组合,使总差和最小

Solution

贪心地认为,同一个袋子里的两杯奶茶重量应该接近

即,若先对数组排序,然后分组,同组两杯奶茶是相邻的。

即,从序列 1 , 2 , 3 , 4 , . . , 2 n {1,2,3,4,..,2n} 1,2,3,4,..,2n中有 2 n − 1 2n-1 2n−1对相邻元素,选取作差最小的前 n − 1 n-1 n−1对相邻元素即可

基此可以图论爆搜:建边集数组,边 [ i : − > i : 1 ] . v a l = a [ i + 1 ] − a [ i ] [i:->i:1].val=a[i+1]-a[i] [i:−>i:1].val=a[i+1]−a[i]然后按边权排序,然后dfs搜 n − 1 n-1 n−1层,每层搜一条弧头弧尾未vis的边

Code

DFS θ ( 2 n ) n − 1 \theta(2n)^{n-1} θ(2n)n−1,TLE

#include<bits/stdc++.h>
using namespace std;
using ll=long long;const int N=55;
int n;
int a[2*N];struct Edge{int from,to,val;
}edge[2*N];
int cnt_e=0;
void add(int u,int v,int val)
{edge[cnt_e].from=u;edge[cnt_e].to=v;edge[cnt_e++].val=val;
}
bool cmp(const Edge& lhs,const Edge& rhs) {return lhs.val<rhs.val;}bool vis[N]={0};int ans=0x7f7f7f7f;
vector<Edge> vec;
void dfs(int lvl,int sum)
{if(lvl>n-1){cout<<sum<<'\n';for(auto it:vec) cout<<it.from<<" "<<it.to<<" "<<it.val<<'\n'; cout<<'\n';ans=min(ans,sum);return;}for(int i=0;i<cnt_e;i++){if(!vis[edge[i].from] && !vis[edge[i].to]){vis[edge[i].from]=1;vis[edge[i].to]  =1;vec.push_back(edge[i]);dfs(lvl+1,sum+edge[i].val);vis[edge[i].from]=0;vis[edge[i].to]  =0;vec.pop_back();}}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=2*n;i++) cin>>a[i];sort(a+1,a+2*n+1);for(int i=1;i<=2*n-1;i++){add(i,i+1,a[i+1]-a[i]);}sort(edge,edge+cnt_e,cmp);  dfs(1,0);cout<<ans;return 0;}

枚举

打表观察一下选出的组合,还是前边那句同组两杯奶茶是相邻的

而未选用的两杯奶茶未必相邻:只需满足减去这两个元素后,剩余序列俩俩一组依旧相邻即可,eg, { _ , 2 , 3 , _ , 5 , 6 , . . } \{\_,2,3,\_,5,6,..\} {_,2,3,_,5,6,..}

能枚举出所有删点的情况即可。

删去两个点将原序列分为三个区间,需要这三个区间长度均为偶数,才符合依旧相邻的规则

,eg { 1 , 2 , _ , 4 , 5 , _ , 7 , 8 } \{1,2,\_,4,5,\_,7,8\} {1,2,_,4,5,_,7,8}

删点策略为:第一个点必为奇数,第二个点与第一个点间隔偶数距离,然后简单读相邻元素差即可。

一点点思维的小模拟。

Code AC

#include<bits/stdc++.h>
using namespace std;
using ll=long long;int n;
const int N=55;
int a[2*N];
int b[2*N];
bool vis[2*N]={0};
int ans=0x7f7f7f7f;void solve()
{int sum=0;for(int i=1;i<=2*n;){if(vis[i]) i++;if(vis[i]) i++;sum+=a[i+1]-a[i];i+=2;}ans=min(ans,sum);
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=2*n;i++) cin>>a[i];sort(a+1,a+2*n+1);for(int i=1;i<=2*n;i+=2){vis[i]=1;for(int j=i+1;j<=2*n;j+=2){vis[j]=1;solve();vis[j]=0;}vis[i]=0;}cout<<ans;return 0;}

ACM2023SWJTU寒假选拔赛2不完全题解相关推荐

  1. ICPC训练联盟2021寒假冬令营(2)(部分题解)

    ICPC训练联盟2021寒假冬令营(2)(部分题解) B - Diplomatic License In an effort to minimize the expenses for foreign ...

  2. 郑州轻工业大学2019学年第十一届蓝桥杯校内选拔赛Java B组 题解

    @郑州轻工业大学蓝桥杯校内选拔赛 题解 笔者自述 前些天参加学校的蓝桥杯校内选拔赛,做完之后感觉题大部分不是很难,就把考场上的代码保存下来,给大家做个简单的注释,和解析.因为后来参加会议,比较忙,所以 ...

  3. 2020ICPC·小米 网络选拔赛第一场 全部题解

    整理的算法模板合集: ACM模板 目录 题目传送门 题目总体情况 A.Intelligent Warehouse B.Intelligent Robot C.Smart Browser D.Route ...

  4. 2022—SWJTU-寒假ACM校队选拔赛第三场-题解

    A - A 算法分析 要想让 只能是发生在进位的时候,因此每逢尾数为 9 时就会对答案产生贡献. AC code #include<bits/stdc++.h> using namespa ...

  5. NEFU 2021大一寒假集训总结赛 全题解

    比赛链接:这里 OP 肝了两个半小时A,没过-- sl大佬也写题解了 A SET 最大公约数 感谢老师的标程~ 思路 任选两数 a,b 做 2*a-b 运算,可以理解成 a + a - b ,即 a ...

  6. 牛客寒假算法基础集训营 题解

    A. 处女座与线性代数 题目描述 众所周知,处女座是数学大师.他定义了k维空间里的处女座点. 对于给出的k维度空间上N个点,处女座点满足: 对于这个点P和空间里任意其他两个点P1P1.P2P2,有do ...

  7. ZAFU_2021_2_17_2021寒假个人赛第四场题解

    A题 原题链接:https://codeforces.com/problemset/problem/1296/A 相关tag:简单思维 我们每次操作可以把数组中的一个数变为另一个数,那么如果这两个数同 ...

  8. 2020寒假集训排位赛 Cow Gymnastics 题解(思维)

    专题链接:https://codeforces.com/group/5yyKg9gx7m/contest/269717/problem/A 思路 这道题乍一看没什么思路,但经过观察可以发现,如果两头牛 ...

  9. 黑龙江农垦科技职业学院喜迎寒假多校联赛2——题解

    J题 比赛开始了清楚姐姐喊了一句:签到了签到了 选手们纷纷开始签到,现在给出n个数字代表选手们签到所用秒数 请给出第几个选手最先签到.同秒数先输入的算快. (不会吧 不会吧 不会有人用牛客不知道清楚姐 ...

最新文章

  1. 带android小绿人的屏保相册,盘点:那些年我们追过的Android
  2. angular2 表单
  3. CF 6 A. Triangle
  4. 2021春季每日一题【week4 完结】
  5. python中beautifulsoup是什么库_BeautifulSoup库详解(个人整理)
  6. Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果
  7. 第一章 计算机系统概述 1.1 计算机发展史 [计算机组成原理笔记]
  8. Page_PreInit在网页传值的应用
  9. 上传自定义日志_ZKEYS系统重磅更新,新增后台数据库备份、主控运行日志管理等新功能!...
  10. Python接口自动化之接口依赖
  11. Ruby eventmachine install
  12. 计算机会计技术特点,会计电算化的特点
  13. Lucene 如何热备份
  14. C语言:一种高效、易学的编程语言
  15. android暗水印技术,基于Android的隐藏数字水印技术的研究与实现
  16. Python使用quote、unquote、urlencode、urldecode对url编码解码
  17. 如何看懂EMC测试报告
  18. python如何在图片上添加文字_Python在图片中添加文字的两种方法
  19. ElasticSearch Docker 部署实例
  20. spring框架的优势

热门文章

  1. 地下城与勇士(DNF)格兰之森副本(幽暗密林、幽暗密林深处、雷鸣废墟、猛毒雷鸣废墟、冰霜幽暗密林、格拉卡、烈焰格拉卡、暗黑雷鸣废墟)(童年的回忆)
  2. 51单片机LCD显示温度与串口接受温度
  3. Ubuntu14.04上安装calamari
  4. oracle图书操作、sql语句查询+授权、视图、索引、表操作
  5. 元·认知·人机环·渔樵耕读
  6. ClickME 隐私策略
  7. 2021年最新最全Flink系列教程_Flink快速入门(概述,安装部署)(一)(JianYi收藏)
  8. k8s使用ipvs模式
  9. 单身狗福音:钢铁直男也可以用AI歌曲俘获女友芳心!
  10. 详细地址通过正则抽取省市区