吉大培训 day 1 test
2016-01-16 21:52
323 查看
开心的培训又开始了
今天是基础算法
所以我们来看一些比较奇怪的算法题
01
现在有一个n结点的树 并给你每一个节点的度数 你的目的是求出最长链的长度
02
已知某矩阵{a、b ,c ,d}的dec=a*d-b*c;
现在给你一个矩阵A 让你求出 dec=0的 矩阵 并使两个矩阵的差的最大值最小
03
求斐波那契数列的第n项%mod的值 其中n mod 为 输入值 mod 的范围为10的七次方+7 n<=10^18
代码实现 02的代码我正在改进 暂时没有
那我就发一下比较简单的01 和 03
03
各位 明天见~!~~~
今天是基础算法
所以我们来看一些比较奇怪的算法题
01
现在有一个n结点的树 并给你每一个节点的度数 你的目的是求出最长链的长度
[code]01 我们可以利用贪心思想 以一种以1为单位的数插到主树干上 但是每插一次 长度就会发生一定的改变 02 无名算法 找出所有度数不是1的点 把这些点的个数 + 1 输出即可 03 需要注意 如果不满足树 的 定义需要输出-1 而满足树 的前提是 各节点的度数 和 = 2*(n-1)
02
已知某矩阵{a、b ,c ,d}的dec=a*d-b*c;
现在给你一个矩阵A 让你求出 dec=0的 矩阵 并使两个矩阵的差的最大值最小
[code]01 赤裸裸的计算二分 没什么说的 直接二分答案求出的差最大值最小矩阵的元素的范围 02 求出范围之后 求交集即可 03 值得注意的是 在这里直接的计算实际上比人为的分类讨论更加简洁 04 我们也可以利用比例的性质 直接二分两个 比例之间的 关系值 k 这也是一种二分答案 但确实有一定的精度误差
03
求斐波那契数列的第n项%mod的值 其中n mod 为 输入值 mod 的范围为10的七次方+7 n<=10^18
[code]01.并没有什么说的 这么大的数据 如此经典的的模型 不用Matrix 实在是太白瞎了 02.要注意数据范围 本题因为送分 每一个点都在long long 极限附近!! 03.重载运算符的面向对象的方法会更加简便 04.二进制的快速幂会使常数缩小为正常的2~3分之一 虽然这对于log 来说并没有什么用 但是要养成良好的习惯
代码实现 02的代码我正在改进 暂时没有
那我就发一下比较简单的01 和 03
[code]#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define MAXN 20 int a[MAXN+1]; int tmp; int n; int main() { freopen("tree.in", "r", stdin); freopen("tree.out", "w", stdout); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; if(sum!=2*(n-1)) {cout<<"-1"<<endl;return 0 ;} for(int i=1;i<=n;i++) if(a[i]==n-1) {cout<<"2"<<endl;return 0;} int sum=0; for(int i=1;i<=n;i++) sum+=a[i]; for(int i=1;i<=n;i++) { if(a[i]!=1) tmp++; } tmp++; cout<<tmp<<endl; fclose(stdin); fclose(stdout); return 0; }
03
[code]#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; long long mod; struct Matrix { int n; int m; long long a[4][4]; Matrix () {} Matrix (int x,int y) { n=x,m=y; memset(a,0,sizeof(a)); } }; Matrix operator*(Matrix a,Matrix b) { Matrix c(a.n,b.m); for(int i=0;i<a.n;i++) { for(int j=0;j<b.m;j++) { for(int k=0;k<a.m;k++) { (c.a[i][j]+=a.a[i][k]*b.a[k][j]%mod)%=mod ; } } } return c; } Matrix pow(Matrix a,long long x) { Matrix res (a.n,a.m); for(int i=0;i<a.n;i++) res.a[i][i]=1; for(; x; x>>=1 , a=a*a) { if(x&1) { res=res*a; } } return res; } int main() { freopen("fibonacci.in", "r", stdin); freopen("fibonacci.out", "w", stdout); long long n; cin>>n>>mod; Matrix ans(2,2); Matrix tmp(2,2); ans.a[0][0]=ans.a[0][1]=1; tmp.a[0][0]=tmp.a[0][1]=tmp.a[1][0]=1; ans=ans*pow(tmp,n-1); cout<<ans.a[0][0]<<endl; fclose(stdin); fclose(stdout); return 0; }
各位 明天见~!~~~
相关文章推荐
- iOS 文字动画,文字逐个显示
- Qwt中picker(拾取器)显示设置
- 父类引用指向子类对象
- RT3070L无线网卡移植
- 在Windows下编译PyCaffe
- 快学Scala 第六章习题答案
- JDK,JRE,JVM区别与联系
- 动态规划-代码(1)
- keySet和entrySet速度区别
- openwrt
- MongoDB中的数据聚合工具Aggregate和Group
- openvswitch常用操作
- 高级工程考试通过总结
- 【c++】智能指针
- 深度分析Java的ClassLoader机制(源码级别)
- Android Studio下多Module程序开发总结
- ubuntu下编译unp源码
- 打磨移动时代的前端团队
- mysql主主复制
- Java中的权限管理