思维
daq0411
这个作者很懒,什么都没留下…
展开
-
B. Take Your Places!(Codeforces)
先判断奇数和偶数的个数情况:if(n==1) 则不用处理,输出0else if(奇数和偶数的个数相差大于1)则不存在符合条件的序列,输出-1else if(奇数的个数大于偶数的个数)只能奇数放在第一个进行排列else if(偶数的个数大于奇数的个数) 只能偶数放在第一个进行排列else if(奇数和偶数的个数相等) 奇数放在第一个和偶数放在第一个取最小完整代码如下:#include<iostream>#include<vector>#include<cm..原创 2021-08-31 16:30:56 · 271 阅读 · 1 评论 -
C. Compressed Bracket Sequence (Codeforces)
数据范围不大,我们就枚举,以当前的左括号为开始可以产生多少组符合条件的括号对。如果右括号的数量大于左括号的数量,则break;否则的话判断左括号和右括号的数量关系,我们把当前左括号的数量设置为sum,其他后面的左括号数量设置为oth,如果多余的右括号小于oth,则跟当前的左括号组不成匹配对,我们继续往下找;如果某一点时多余右括号的数量和oth相等了,ans++;如果某一点时多余右括号的数量比oth大了,我们再跟sum 作比较,如果小于等于sum,则ans += yu+1;否则ans += sum.原创 2021-08-31 16:22:04 · 299 阅读 · 0 评论 -
HDU - 7106 Function
因为在1~1e6中g(x)的种类共有54种,所以我们考虑对g(x)进行枚举,然后根据二次函数找最小值,将原式进行化简,得到f(x) = x^2^ (A * g(x) + B) + x (C * g(x)^2^ + D * g(x))然后分情况进行讨论:(注意取值的时候取的值要小于n)a>0开口向上,离对称轴越近函数值越小1.对称轴 < 0,最小值取gx[i][0];注意(gx[i][0] <= n )2.对称轴 > n,最小值取gx[i][upper_bound(g..原创 2021-08-30 18:49:39 · 92 阅读 · 0 评论 -
The 15th Chinese Northeast Collegiate Programming Contest - K.City
虽然不难,但是感觉很有意思的一道题,下面有几个点感觉还是挺妙的:· 并查集只能加边不能减边;·对数据进行离线处理,方便我们进行排序处理(后面会解释);首先数据的范围很大,如果我们每做一次判断都要进行一次遍历的话时间复杂度肯定会超时,所以我们想能不能像预处理那样只需要做一次就能得到所有我们想要的答案呢?首先我们先对所有边进行一个从大到小的排序,所以我们在判断毁掉了多少条路的时候只需要判断当前边的值是否小于毁灭的值即可,如果不能毁掉那么后面的也无法破坏,break就好。那么还是没有解决 O(t *..原创 2021-08-22 21:05:14 · 374 阅读 · 0 评论 -
HDU-7087 对象存储调度问题(n个物品装入m个箱子)
官方的题解注意到数据对象的大小都是2的整数次幂,贪心地把这些数据对象从大到小去往分条里存就是对的。一个做法是每次取剩下最大的数据对象,然后用堆来维护分条,每次取剩余空间最大的一个分条并将该数据对象存进去,如果存在存不进去的情况则无解,否则就有解。时间复杂度:O(n log n +m log m)类似于我们把n个物品装入m个箱子中,看是否能够装下,所以我们每次都是取最大的物品放入剩余空间最大的箱子中,如果物品全都装进入则输出“Yes”,否则输出“No”。这里我们用优先队列来实现,完整代码如下:..原创 2021-08-22 10:04:36 · 369 阅读 · 0 评论 -
HDU7095 - Add or Multiply 1 (百度之星复赛)
因为加法和乘法的次数交换也不影响结果,所以我们先对其进行一个排序方便我们后续的处理,假设我们有n个加号,m个乘号。(n<=m)交换也同理if(n>m) swap(n,m);之后我们就要考虑情况的种类了,首先假设我们把n个加号可以分成1~n段(也就是把n个“不同的”加号分成k个集合,1 <= k <= n),然后我们对这k个集合进行全排列答案也就是A(k,k),这k段可以把m个乘号分成k-1,k,k+1段(需要注意的是如果n=m,则当k=n时,最多分成n段)然后对这k-1,k..原创 2021-08-22 09:50:14 · 231 阅读 · 0 评论 -
HDU-7018 Banzhuan(取模,数论)
刚开始不知道样例给的60哪来的,后面想明白了是先放到最上边等这个方块掉下去。最小的花费需要注意的是(1,1,z)(1<=z<=n)这一列没有,剩下的就是取模的问题了,这该死的取模!完整代码如下:#include<iostream>#include<cstdio>using namespace std;typedef __int128 ll;const int mod = 1e9+7;void scan(__int128 &x)//输入{ .原创 2021-08-04 09:58:04 · 243 阅读 · 0 评论 -
HDU-7007 净化
先贴代码,明天再写吧……#include<iostream>#include<cstdio>#include<cmath>using namespace std;typedef long long ll;ll shu[100000+10];int main(){ int t; scanf("%d",&t); while(t--){ ll n,m; scanf("%lld%lld",&n,&m); ll sum =..原创 2021-08-01 22:57:00 · 150 阅读 · 0 评论 -
HDU-7005 随机题意
先排序,然后遍历,更新Min即可,这才是签到题……for(int i=1;i<n;i++){ int a = shu[i]; if(a + k >= Min){//可以有一种当前数字带来的新种类 Min = max(Min+1,a-k+1); ans++; } //如果这个条件不满足,说明在[a-k,a+k]的数字在前面都出现过了}完整代码如下:#include<iostream>#include<cstdio>#include<al.原创 2021-08-01 22:54:20 · 83 阅读 · 0 评论 -
HDU-7004 签到
这道题的话打个表就很容易看出来要用快速幂求2的倍数,每隔一次操作结果就是上一步乘2。主要还是取模的问题,模不是负数,所以在取模的时候不能直接取模,如果我们要对x进行取模,我们可以写成==(x+mod)%mod==当时WA了以为是爆了,所以用了__int 128,事后发现不用这么麻烦,long long就可以了。完整代码如下:#include<iostream>#include<cstdio>using namespace std;typedef __int128 ll.原创 2021-08-01 22:45:55 · 83 阅读 · 0 评论 -
HDU-7003 猎人杀
题意每死亡一个玩家做一次判断,如果狼人死亡,猎人胜利,反之死的是猎人并且场上还剩下2个玩家,狼人胜利。先是狼人杀玩家,做判断,然后死亡的猎人按照自己的猎杀顺序进行猎杀,做判断,如果游戏继续,就按照死亡的玩家的猎杀顺序继续进行猎杀,直至游戏结束,就是一个纯模拟。完整代码如下:#include<iostream>using namespace std;int game[60][60];int iden[60];int main(){ int t; cin >> t;原创 2021-07-31 23:00:45 · 215 阅读 · 0 评论 -
HDU-6999 萌新
不知道我脑子一天天在想什么题意找到一个 c 使得 a%c = b%c,分别找到 c 的最大和最小值,因为c-1是正整数,所以c > 1,找不到就输出-1。题解我们先排序,让a >= b,方便后续的操作;如果a = b ,最小为2,最大为a;如果a - b = 1,c最大最小都是-1;其他情况化简即可a % c = b % c=> (a - b) % c=> 所以 c 最大为 a - b;找最小的时候肯定是一个素数(如果是一个合数的话肯定也能继续分解),所以我..原创 2021-07-31 22:09:34 · 93 阅读 · 0 评论 -
Game on Plane(思维,pair)
这道题难应该就难在题目理解上吧,这个题大致意思就是给你n条直线,每条直线由两个点确定,然后Alice从中选择1~n条直线,然后Bob在n条直线中选择一条直线,输出Alice选的直线与Bob选择的直线的交点最少。因为Alice想要选择尽可能多的直线与Bob选择的直线相交,所以Alice尽可能选择不平行的直线,Bob想要选择一条直线与尽可能少的直线相交,所以选择与更多平行的直线平行的那一条直线。我们用pair来记录dx和dy,用最大公倍数进行化简。完整代码如下:#include<iostream.原创 2021-07-31 18:16:33 · 76 阅读 · 0 评论