2011年12月1日
摘要:
题意:这题题目写得够坑的。前面一大串都是无关信息。其实很简单,就是在二维坐标里面给出若干个圆(阴影),给出起始点和终止点。问从起始点到终止点,怎么走可以使暴露在非阴影下的路径最短。输出最短路的值。思路:其实很简单,刚一看,设计到圆面积感觉比较有点蒙,其实圆可以当成点来处理,如果要进去某个圆。则朝着这个圆的圆心的直线方向走肯定是最短。所以就可以抽象成一个图。每个圆也是一个点。点与点的路径和圆半径有关,构图时候注意一下即可。然后dijstra算法。#include<iostream>
//#include<stdio.h>
#include<math.h>
//
阅读全文
posted @ 2011-12-01 16:16
不是我干的
阅读(179)
推荐(0)
2011年11月29日
摘要:
第一次接触线段树。题意:又见farmer john。有N只牛,每只牛都有它的身高。给出任意一个区间[i ,j],叫你求出这个第i只牛到第j只牛这些牛中身高最高的和最低的差值。思路:线段树。每个树节点有参数:L=区间左值R=区间右值MAX=区间内身高最大值MIN=区间内身高最小值#include<iostream>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
const int SUM=150010;
const int MAX=(1<<30);
cons
阅读全文
posted @ 2011-11-29 09:07
不是我干的
阅读(119)
推荐(0)
2011年11月27日
摘要:
思路:裸的最大下降子序列#include<iostream>
#define max(a,b) (a>b?a:b)
using namespace std;
const int N=10010;
const int inf=32770;
int num[N],dp[N];
int n;
int solve()
{ int ans=0; memset(dp,0,sizeof(dp)); num[0]=inf; for(int i=1;i<=n;i++) { for(int j=i-1;j>=0;j--) { if(num[i]<=num[j]) { dp[i.
阅读全文
posted @ 2011-11-27 21:58
不是我干的
阅读(149)
推荐(0)
摘要:
题意:给定一个字符换,给定surprising的定义。要求判断是否。思路:水题。因为很久没用map了,特地用下map。#include<iostream>
#include<string>
#include<map>
using namespace std;
string str;
int main()
{ while(cin>>str,str!="*") { bool flag=true; for(int i=0;i<str.length()&&flag;i++) { map<string,int
阅读全文
posted @ 2011-11-27 10:58
不是我干的
阅读(284)
推荐(0)
2011年11月26日
摘要:
LIS的简化版。#include<iostream>
using namespace std;
const int N=30005;
int n;
int data[N];
int stack[N];
int sp;
inline void insert(int dat)
{ int head=1,tail=sp-1; int mid; while(head<tail) { mid=(head+tail)/2; if(stack[mid]<=dat) { head=mid+1; } else { tail=mid; } } stack[hea...
阅读全文
posted @ 2011-11-26 23:33
不是我干的
阅读(138)
推荐(0)
摘要:
题意:一群匪徒要进入一个酒店。酒店的门有k+1个状态,每个匪徒的参数是:进入时间,符合的状态,携带的钱。酒店的门刚开始状态0,问最多这个酒店能得到的钱数。思路:dp数组为DP[T][K].转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1])因为转移i只跟i-1有关,所以可以用滚动数组dp[2][k].其实这道题的转移方程很容易想到,只是编程的时候处理边界等细节比较麻烦。#include<iostream>
#include<algorithm>
#define max(a,b) (a>b?a:b)
using
阅读全文
posted @ 2011-11-26 19:42
不是我干的
阅读(166)
推荐(0)
摘要:
题意:裸的最长上升子序列。思路:传统的O(N^2)的DP没法过。用O(NLOGN)的贪心方法过。#include<iostream>
using namespace std;
const int N=100005;
int n;
int stack[N];
int sp;
void insert(int t)
{ int head=1; int tail=sp-1; int mid; while(head<tail) { mid=(head+tail)/2; if(stack[mid]<t) { head=mid+1; } else { tail=...
阅读全文
posted @ 2011-11-26 16:33
不是我干的
阅读(178)
推荐(0)
摘要:
巨水的dp。思路很简单:每次dp[i]都是和dp[i-1]时候的0的个数和1的个数有关而已。打表之后发现是斐波那契数列。。。。。。#include<iostream>
using namespace std;
const int N=50;
long long int dp[N];
int n;
void solve()
{ dp[1]=2; long long a=1,b=1; for(int i=2;i<=45;i++) { long long tmp=a+b; b=a; a=tmp; dp[i]=a+b; }
}
int main()
{ solve...
阅读全文
posted @ 2011-11-26 14:04
不是我干的
阅读(134)
推荐(0)
2011年11月25日
摘要:
多天之前就理清了这题的思路,因为这礼拜六考通原,一直没开编译器A了这题。终于在考通原前一天憋的蛋疼A之。题意:求最大矩阵。思路:是很好的最长连续子序列的变形题。一维最长连续子序列状态转移方程:dp[k]=max(dp[k-1]+mat[k],mat[k]);(*)现在是求最大矩阵:启发:试想,我们求出的最大矩阵和之前一维的最大子序列的差别就是多了连在一起的几行。即“变厚了”。试想行数为1时,列数为n时,用方程(*)解。行数为2时,列数为n时,就是先求一下第一行的,然后求第二行的,然后求第一行同列数字相加成的(即压扁后的)。.....这样就能发现此中的规律,详细看代码。#include<i
阅读全文
posted @ 2011-11-25 20:59
不是我干的
阅读(119)
推荐(0)
2011年11月12日
摘要:
题意:先给一个序列,求两个最长连续子序列的和,看公式就很容易理解题意。思路:最长连续子序列的状态转移方程f[i]=max(f[i-1]+w[i],w[i])解决这道题的关键点在于要先正序处理一遍,然后再逆序处理一遍。然后枚举这个序列的分割点。这样时间复杂度为O(n);#include<iostream>
#define max(a,b) (a>b?a:b)
using namespace std;
const int N=50005;
int n;
int mat[N];
int remat[N];
int in[N];
void dp()
{ for(int i=1;i&l
阅读全文
posted @ 2011-11-12 19:34
不是我干的
阅读(180)
推荐(0)