摘要:
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1043题目大意:一个2000*2000方格坐标,x,y范围都是【-1000,1000】。现在给你一个圆弧,告诉你圆弧的两个端点和任意一个中间点。现在要你算出最小的矩形(长和宽都要为整数,即四个顶点在方格顶点上)来完全覆盖这个圆弧。算法思路:很明显要算出圆心,这个可以有线段中垂线交求,也可以由方程,只是很麻烦。然后以圆心找出这个圆的左右上下四个极点,判断是否在圆弧上(用叉积即可),与给出的三个点一起维护这段圆弧的四个方向的极大点。然后向上向下取整即可。代码:#include#includ 阅读全文
摘要:
题目链接:http://codeforces.com/problemset/problem/337/D参考博客:http://www.cnblogs.com/chanme/p/3265913题目大意:给你一个n个点的无向树。任意两点的距离为中间经过的边数。现在某个点上有本魔法书,这本书对与这个点距离小于等于d的点有影响。给你收集到的m个受影响的点(信息不一定全对)。要你判断有多少个点可能放魔法书。算法思路:我参考别人的想法,自己开始怎么也想不出好的算法,n也太大。这题用树形dp,两遍dfs来统计出每一个点到所有这个m个受影响点的距离的最大值。只要这个最大值#include#include#in 阅读全文
摘要:
题目链接:http://codeforces.com/problemset/problem/212/E题目大意:给你一个无向树,现在用两种颜色去给这颗树上的节点染色。用(a,b)表示两种颜色分别染的节点数。满足以下条件:1.任何一种颜色至少使用一次,即a>=1&&b>=1。2.两种颜色染的节点不能相邻,即不能有边的两端染不同色。要你使a+b值最大下输出不同的(a,b),按照a升序输出。算法思路:很容易得出一个结论:a+b的最大值就是取n-1,即只有一个点不染色。我们就想到树形dp。先dfs求出以每个节点为根的树的节点数。假如我们讨论以u为根的树的染色方案,我们就要知 阅读全文
摘要:
题目链接:http://lightoj.com/volume_showproblem.php?problem=1057题目大意:在二维矩阵中,给你一个起点和至多15个的目标点。要你求出从起点出发经过完所有的点后回到起点的最短路径值。每个点一步可以向 八个方向走。算法思路:一看就觉得是tsp,用状态压缩。而任意两点的距离就是相应横纵坐标差的较大值。具体看代码。代码:#include#include#include#includeusing namespace std;const int maxn = 1>T; for(int cas=1; cas>m>>n; char s 阅读全文
摘要:
题目链接:http://lightoj.com/volume_showproblem.php?problem=1051题目大意:给你一个字符串,只包含大写字母和‘?’,如果字符串中出现了连续三个以上的元音字母或者连续五个以上的辅音字母,则这个字符串是bad,不然就是good.‘?’号可以替换任意字母。替换以后如果既可以出现连续三个以上的元音字母或者连续五个以上的辅音字母,也可以不出现,则输出Mixed.算法思路(参考别人的):这个地方出现不含‘?’的连续三个以上的元音字母或者连续五个以上的辅音字母则为BAD, 如果含‘?’,则看替换后的情况。具体看代码。代码:#include#include. 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值。现在要你破坏任意一个边(要付出相应边权值的代价),使得至少有两个连通块。输出最小代价值。算法思路:这题坑多,要考虑仔细:1.图是边双连通图,就做不到删除一边得到两个连通块,这种情况输出-1. 2.图是连通但不边双联通,就用tarjan找出桥中权值最小的,这里有个巨坑,如果桥最小的权值为0,这时根据题意,要输出1而不是0(看看题就能理解)。3.图不是连通的,就不需要去删边,即直接输出0。4.还要注意,输入的边有可能出现重边,这个要. 阅读全文
摘要:
#include #include #include #include #include #include #include #include using namespace std;const int maxw = (1=0; k++){ dp[i][j] += dp[i-1][j-k*(1=0) dfs(n-1,w-num[n]*(1>T; for(int cas=1; cas<=T; cas++) { scanf("%d %d",&A,&B); getW(A); //得到A的... 阅读全文
摘要:
题目链接:http://codeforces.com/problemset/problem/219/D#include#include#include#include#include#includeusing namespace std;const int maxn = 2*1e5+100;int dp[maxn]; //dp[i]表示以i为根遍历全部的点的最小的权值。struct Edge{ int u,v,w; int next; Edge(int u=0,int v=0,int w=0,int next=0): u(u), v(v), w(w), next(next)... 阅读全文
摘要:
#include#include#include#include#includeusing namespace std;const int maxn = 100;int dp[maxn][maxn]; //dp[i][j]表示以i为根,保留j个点的最大权值。int N,Q;int G[maxn][maxn];int num[maxn]; //以i为根的树的节点个数。//这里处理的时候要注意可以把边的权值压倒儿子节点。void dfs(int u,int fa){ num[u] = 1; for(int v=1;v0;i--){ //相对于下面的V -> 0 ... 阅读全文
摘要:
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1332#include#include#include#include#include#includeusing namespace std;const double eps = 1e-8;const double PI = acos(-1.0);const double INF = 1000000000000000.000;struct Point{ double x,y; Point(double x=0, double y=0) : x(x),y(y){ } //构造函... 阅读全文