- 博客(17)
- 收藏
- 关注
原创 2021-02-08
读入之后先用sort排序,然后用两个指针一起向中间走,每次选择都尽可能的让当前状态下最大的和最小的分在一组,如果不行就最大的单独分一组,这样贪心下来就是最少分的组了 int a[1000000],ans; int main(){ int n,w; scanf("%d",&w); scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]);//读入 sort(a,a+n);.
2021-02-08 19:04:16 67
原创 2021-02-08
看完题目用最小生成树做了 int n,m; struct node{ int x,y,z; }e[10050]; int cmp(node a,node b)为下面sort函数服务 { return a.z<b.z; } int Find(int x) { if(x!=fa[x])return fa[x]=Find(fa[x]); return fa[x]; } int main() { cin>>n>>m; for(.
2021-02-08 18:51:19 55
原创 2021-02-05
看清题干无非是要按大到小排,生日相同时进行特判,用结构体和sort 函数 using namespace std; struct node//结构体排序 { string s;//名字 int n,y,r,num;//年,月,日,输入的编号。 }a[110]; int n; bool cmp(node a,node b){ if(a.year != b.year) return a.year < b.year;//如果出生年份不相等便直接按照年份进行排序 else{ if(a.mon !.
2021-02-05 20:48:28 51
原创 2021-02-05
由于本提的数据对于 100%100% 的数据,n≤5000, a≤50, b≤200, x ≤280, y ≤100。 直接用桶排序最简便 最快捷 #include<iostream> using namespace std; int a[105];//定义一百个桶子,a[i]代表用i个力气能摘到的苹果的数目 int main(){ int n,s,h,k,j,l,t=0; cin>>n>>s>>h>>k; h=h.
2021-02-05 20:18:44 60
原创 2021-02-01
一题暴力枚举 题意4根木棒组成一个正三角形,则必有 2根长度相等。 并且另外2根长度之和,等于 前2根相等的木棒的长度。 cin>>n; for(int i=1; i<=n; i++) { cin>>a[i];//输入 minn=min(minn,a[i]);//找n根最小 maxx=max(maxx,a[i]);//找n根最大 b[a[i]]++;算出相同长度几根 } for(int i=minn+1; i<=maxx; i++)最小长度开始量.
2021-02-01 16:58:06 46 1
原创 2021-01-29
连续编号为 1-n的 n个房间,每个房间关押一个犯人,有 M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 设所有情况为全集u,越狱情况为集合a,不越狱集合为b 求a很困难 不如求u-b=a u=m的次幂 b=m*(m-1)的n-1次幂 但是直接写仍然超时 只能使用快速幂才能通过 long long n,m; long long pow(long long a,long long b) { if(b==1) return a%p; .
2021-01-29 14:47:00 51
原创 2021-01-28
那么,我们假设n[i]为结尾在第ii个格子的最优解,用ans数组来表示这些数(即ans[i]表示这个集合中的第i个数),那么很显然,答案就是ans[n]。 ,如果我们在第i个格子,那么我们可以选择在第ii−1个格子的最优解+第i个格子的值,或第i个格子的值或0。 #include<bits/stdc++.h> using namespace std; int main() { int n[200005],p,ans[200005]={0}; int sum=-9999999; .
2021-01-28 21:37:47 39
原创 2021-01-27
用结构体排序 将木棍的某一属性按照从大到小的顺序进行排列(长度优先) 需要注意的是,如果在两根木棍长度相等的情况下,必须要按宽度排序 在排序后,我们直接可以扔到这个长度不管了,直接把宽度跑一遍最长不上升子序列,得出最长不上升子序列的个数。但是我们知道,最长不上升子序列的个数等于最长上升子序列的长度, struct Stick { int l, w; }t[5050]; // 首先定义一个结构体,存放木棍的长度和宽度. int n, dp[5050]; // 然后定义木棍的数量 n 和 dp 数组. bo.
2021-01-27 18:22:33 43
原创 2021-01-26
175438 //删掉7 15438 //删掉5 1438 //删掉4 138 //删掉8 13 这一道贪心的题 找到如何去判断才能最优 经过反复推敲 发现从左起如果第 i 个数比第 i-1大我们就删掉第i个 题目并没有很明确的说要去掉前导零,但是事实上数据是要去 int main() { cin>>s; scanf("%d",&n); int len=s.length();//看一下有多少位 for(int i=0;i<len;i++) .
2021-01-26 21:12:10 62
原创 2021-01-23
这题主要是lcs转换为lis的巧妙之处 3←1,2←2,1←3,4←4,5←5对应转换后 变成 12345 32145 那就转换成求最长不降子序列序 int main() { int n; scanf("%d",&n); int x; for (int i=1;i<=n;i++) { scanf("%d",&x); m[x]=i; } for (int i=1;i<=n;i++) { scanf("%d",&a[i]); a[i]=m[a.
2021-01-23 22:05:05 46
原创 2021-01-21
今天在B站上学习了最小生成树的prim和kruskal两种算法的概念 然后去洛谷找题做 用了kruskal算法进行解题 有了思路和想出核心代码的模式 还在讨论区找到一篇对我理解帮助很大的详细题解 #include<bits/stdc++.h> using namespace std; int n,m,ans=0,father[5001]; struct fkt{int x;int y;int value;}a[200001]; bool cmp(fkt xx,fkt yy){//首先Kru
2021-01-21 18:22:01 55
原创 2021-01-19
对比赛超时题目进行总结 #include <bits/stdc++.h> using namespace std; int main() { char s[1000000]; cin >> s; int length = strlen(s); int i, j, n; for (i = 0; i < length; i++) for (j = i + 1; j < length; j++) {
2021-01-19 22:07:31 43
原创 2021-01-16
一道线性动态规划的题 刚开始没看懂输入输出为啥能拦截6个导弹 后来才知道中间的导弹可以跳过 就是一个查找最长不升子序列 第二问也可以转化成最长升子序列 然后这道题就可以解了 #include<bits/stdc++.h> using namespace std; int n; int len; //记录最长不升子序列即x数组的长度) int a[100005]; //存所有的导弹 int x[100005]; //存当前拦截的导弹的高度 int main(){ .
2021-01-16 23:28:07 53
原创 2021-01-15
稍加分析就能发现,要到达棋盘上的一个点,只能从左边或上面过来(以下称为左点和上点)可以得到核心方程f[i][j]=f[i-1][j]+f[i][j-1] 但是当我写出代码去一直没能通过 后面反复找才发现是越界的问题 最后条件特判边界得以解决 #include<bits/stdc++.h> using namespace std; long long f[40][40],flag[40][40];一个标记 一个来dp int main() { int n,m,i,j,a,b; .
2021-01-15 21:14:30 79 1
原创 2021-01-14
今天刷了一些贪心的题 从地面跳到最高的一定比其它的高度差要大,其次最高的跳到第二低的一定只比从最低的跳到最高的高度差小,比其他的要大,所以我们得到了贪心策略。 每一步考虑当前最优解(高度差最大) 然后选择该石头跳上去 把已经跳过的标记一下 最后发现只要排序 排序后非常简单代码如下 #include<bits/stdc++.h> using namespace std; long long n,A[301]={0},ans; int main(){ cin>>n; f
2021-01-14 22:34:43 50
原创 2021-01-13
看到题目就知道是01背包问题 但是之前没理解于是去看视频重新学习 下面是我学习后通过这题的代码 #include<bits/stdc++.h> using namespace std; int dp[105][1005],w[105],v[105],t,m; int main() { scanf("%d%d",&t,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&w[i],&v[i]); } for(.
2021-01-13 16:32:13 72
原创 2021-01-11
刚开始觉得只是简单的递归 #include<bits/stdc++.h> using namespace std; int f(int n); int main() { int n; cin>>n; int m; m=f(n); cout<<m; } int f(int n) { int m; if(n==1) m=1; else if(n==2) m=2; else m=f(n-.
2021-01-11 21:40:57 53
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人