05 2021 档案
摘要:水题。 struct Fraction { int up,down; bool operator<(const Fraction &W) const { return up * W.down < W.up * down; } }; vector<Fraction> res; int n; int m
阅读全文
摘要:贪心。 对于第$i$个数字,若其不在应在位置,则在$[i+1 \sim n]$中寻找恰好存在与第$i$个数错位的数,交换两个位置上的数;若不存在恰好错位的数,则选择与第$i$个数相等且不在应在位置的数交换。 const int N=1010; int a[N],b[N]; int cnt[4]; i
阅读全文
摘要:暴搜水题~ 。 const int N=30; int need[N]; int feed[20][N]; int res[N]; vector<int> path,ans; int n,m; bool check() { for(int i=1;i<=n;i++) if(res[i] < need
阅读全文
摘要:3577. 选择数字 签到。 int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i],vis[a[i]]=true; cin>>m; for(int i=0;i<m;i++) cin>>b[i],vis[b[i]]=true; for(int i=0;
阅读全文
摘要:思路 思路同k倍区间。 前缀积得到每个点的正负。枚举右端点$r$,统计满足$s[r]$和$s[l-1]$同号的左端点$l$的数目,$s[r]$和$s[l-1]$同号则$s[l \sim r]$为正。$s[l \sim r]$为负的区间数量同理。 const int N=2e5+10; int a[N
阅读全文
摘要:数字本身为质数,且其所有前缀数字均为质数。 思路 枚举每一位 首位只能从${2,3,5,7}$选取 其余位只能从${1,3,5,7}$中选取 int n; bool isprime(int x) { if(x < 2) return false; for(int i=2;i*i<=x;i++) if
阅读全文
摘要:思路一 筛出$10^7$以内素数 判断素数表中的数是否为回文数 注意点 如果一个回文数的位数是偶数,则它的奇数位上的数字和与偶数位上的数字和必然相等,这样的数能被11整除,不可能是素数(11自己除外)。 由上条性质,素数表只要筛到$10^7$即可。 USACO上提交居然MLE?遂放弃记录素数表,直接
阅读全文
摘要:思路 将$32$位二进制数转换为十进制数,用long long存储$n+1$和$n+3$的结果(不超过$33$位),再将结果转成二进制即可。 void solve(LL n) { for(int i=32;i>=0;i--) { int t=n>>i & 1; if(i == 32 && !t) c
阅读全文
摘要:经典问题,直接暴搜出所有方案即可。 const int N=25; bool vis[N][N][N]; int a,b,c; vector<int> ans; void dfs(int x,int y,int z) { if(vis[x][y][z]) return; vis[x][y][z]=t
阅读全文
摘要:预处理出双平方数集合 枚举双平方数中的一对数作为等差数列的首项和第二项 剪枝: 计算出当前等差数列的末项,last=x+(n-1)*d比双平方数集合中最大的数还要大,则无需判断其是否能构成长度为$n$的等差数列。 如果当前公差比双平方数集合中最大的数还要大,那么比当前公差还要大的公差显然也没有枚举的
阅读全文
摘要:将$1 \sim n^2$放置在$n\times n$的棋盘当中,要求当前格子中的数字与其四连通的格子中的数字不相邻。 考虑将当前格子染成黑色,与其四连通的格子染成白色,即下标$(i,j)$的格子,当$i+j$为偶数时染成黑色,$i+j$为奇数时染成白色,则颜色不同的格子中的数字不能相邻。 按从左至
阅读全文
摘要:统计满足$i<j$并且$a_j-a_i=j-i$的数对的数量。 变形,\(a_j-j=a_i-i\)。 开哈希表,对原数组扫描一遍即可。 const int N=2e5+10; int a[N]; int n; int main() { int T; cin>>T; while(T--) { cin
阅读全文
摘要:货仓选址变形题。 将所有星号聚拢到中间的星号上,总花费最小。 移动每个星号的花费是其与中间星号间的距离并减去二者之间的星号数量。 const int N = 1e6+10; char s[N]; int a[N]; int n; int main() { int T; cin >> T; while
阅读全文
摘要:模拟。 string s,t; int m; int main() { cin>>s>>m; while(m--) { string op; cin>>op; if(op == "COPY") { int l,r; cin>>l>>r; t=s.substr(l,r-l+1); } else if(
阅读全文
摘要:找出所有约数,约数$x$所在的第$x$行存在一个$m$需满足条件: $x$不超过$n$ $m/x$不超过$n$。 int n, m; int main() { int T; cin >> T; while(T--) { cin >> n >> m; vector<int> divisor; for(
阅读全文
摘要:零比特填充法。 int main() { int T; cin >> T; while(T--) { string s; cin >> s; int cnt = 0; // 记录连续的1的个数 for(int i = 0; i < s.size(); i++) { if(cnt == 5) { cn
阅读全文
摘要:只能操作长度不超过$n$的区间。 对$1$和$n$所在的位置进行讨论: 若数组已经有序,则答案为$0$ 若$a[1]=1$,只需选择$[2,n]$进行一次重排即可。同理,若$a[n]=n$,只需选择$[1,n-1]$进行一次重排即可。 若$a[1]=n$且$a[n]=1$,则首先选择$[1,n-1]
阅读全文
摘要:首先将数组$a$从小到大排序。 \[ |a_1-x|+|a_2-x|+\cdots+|a_n-x| \ge|a_n-a_1|+|a_{n-1}-a_2|+\cdots +|a_{n/2+1}-a_{n/2}| \] 当$x$位于$a_n$和$a_1$之间时,\(|a_1-x|+|a_n-x| \ge
阅读全文
摘要:状态表示: \(f(i,a,b,c,d)\):到达第$i$个格子,所用卡片$1$数量为$a$张,卡片$2$数量为$b$张,卡片$3$数量为$c$张,卡片$4$数量为$d$张时能够获得的分数最大值。 状态转移: \[ f(i,a,b,c,d)=\max \begin{cases} f(i-1,a-1,
阅读全文
摘要:先考虑没有娇姐发功怎么做。 考虑每只糖糖最后能不能存活:第$i$只糖糖能存活的条件是他后面没有比他大的另外一组的糖糖,所以我们只需要从后往前扫描维护当前位置往后每一组糖糖的最大值是多少然后和当前糖糖的能力值比较就行。 现在再来考虑娇姐发功的问题。 娇姐会在第$c_i$秒使得前$c_i$个人的能力值+
阅读全文
摘要:思路 通过对样例的模拟,发现答案为相邻两个蓝色石子中间最多的红色石子的数量。 双指针做法: const int N=1e5+10; int a[N],b[N]; int n,m; int main() { int T; cin>>T; while(T--) { cin>>n>>m; for(int
阅读全文
摘要:$b[i]$表示第$i$个行第一列是否有雷,即$b[i]$的值只能为$0$或$1$。 一旦第$i-1$行第一列的摆放情况确定,因为要满足$8$连通的格子里的数字限制,第$i$行第一列的摆放情况也随之确定。 递推式: \[ b[i] = a[i-1] - b[i-1] - b[i-2] \] $a[i
阅读全文
摘要:首先将所有点按纵坐标从小到大排序,纵坐标相同的按横坐标从小到大排序,这样一来,每个点+x方向上最近的点(若存在)在排序后的数组宏一定相邻。 DFS搜索与当前点匹配的点,若当前点已经配对,则搜下一个点;若没有配对,则寻找还没有配对的点与当前点配对。 之后分别以每个点为起点进行DFS判环(每次判环前需要
阅读全文
摘要:贪心。 经典问题。 注意点 不要忘记最后一个区间对最长连续挤奶时间区间的更新。 const int N=5010; PII a[N]; int n; int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i].fi>>a[i].se; sort(a,a+n
阅读全文
摘要:按天数模拟。 const int N=110; int month[2][13]={ {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31} }; int cnt[7]; int n; bool
阅读全文
摘要:首先破环成链。 之后枚举$n$处断裂的位置,对于每次断裂形成的一串项链,采用双指针分别统计左边颜色连续的珍珠串长度和右边颜色连续的珍珠串长度。 const int N=355; char s[N<<1]; int n; int main() { cin>>n; scanf("%s",s); for(
阅读全文
摘要:设$minh$为$n$座山峰高度的最小值,$maxh$为$n$座山峰高度的最大值。 枚举最终调整后的最低峰的高度为$k$,则最高峰的高度为$k+17$,对于低于最终最低峰高度的山峰或高于最终最高峰高度的山峰,对他们进行调整。 const int N=1010; int h[N]; int n; in
阅读全文
摘要:最裸的暴力,时间复杂度:\(O(n^3)\)。 const int N=110; int a[3],b[3]; int n; bool check(int c[],int a[]) { for(int i=0;i<3;i++) if(abs(a[i]-c[i]) > 2 && abs(a[i]-c[
阅读全文

浙公网安备 33010602011771号