2011年7月22日

poj 3298 Antimonotonicity

摘要: #include<iostream> //DP, 与sicily 1685. Missile 类似,但数据规模较大,O(n^2)肯定会TLE#include<stdio.h>using namespace std;int num[30010],ans[30010],odd,even; //ans[i]存放形成的序列上的第i个数,假若i表示偶数,则ans[i]<ans[i+1],所以第偶数上的值越小越好,而第奇数上的值越大越好int main(){ int t,n; cin>>t; while(t--) { scanf("%d",&a 阅读全文

posted @ 2011-07-22 23:12 sysu_mjc 阅读(153) 评论(0) 推荐(0) 编辑

poj 3970 Party

摘要: #include<iostream> //求任意多边形面积#include<cmath>using namespace std;struct point{ double x,y;}p[1000];int main(){ int n; while(cin>>n,n) { for(int i=0;i<n;++i) cin>>p[i].x>>p[i].y; if(n<3) { printf("0\n"); continue; } double area=0; for(int i=0;i<n;++i) a 阅读全文

posted @ 2011-07-22 23:10 sysu_mjc 阅读(172) 评论(0) 推荐(0) 编辑

poj 3660 Cow Contest

摘要: // 题意: 有N只牛,M场比赛的结果,(a,b)代表奶牛a能战胜奶牛b,问有多少只奶牛的排名可以确定// 思路: floyd算法的变形,给出一些点之间的大小关系,问有多少点的次序是固定的#include <iostream> // floyd算法using namespace std; #define maxn 102int distF[maxn][maxn];// distF[a][b]= 1 表示a>b, 2 表示a<b ,0 表示 a,b的大小不确定int n,m,i,j;void floyd() ... 阅读全文

posted @ 2011-07-22 23:08 sysu_mjc 阅读(128) 评论(0) 推荐(0) 编辑

poj 3272 Cow Traffic

摘要: // 题意: 求出由入度为0的源点到汇点的所有路径中使用最频繁那条边总共使用的次数// 思路: 设f[i] 为入度为0的源点到节点i的路径条数, g[i] 为节点i到汇点N的路径条数// 枚举每条边(s为始点,t为终点),所有边的f[s]*g[t]的最大值即为答案#include<iostream> //拓扑排序#include<deque>using namespace std;#define MAXN 5002int n,m,table[MAXN][MAXN],side[50002][2];int f[MAXN],g[MAXN],in[MAXN],out[MAXN] 阅读全文

posted @ 2011-07-22 23:07 sysu_mjc 阅读(254) 评论(0) 推荐(0) 编辑

poj 3260 The Fewest Coins

摘要: /*题意:John带了n种币值Vi的确定数量Ci的硬币,而shopkeeper的硬币无限多.给出T,求John支付的硬币数目加上售货员找零的硬币数目的最小值。如果无法支付T,输出-1 支付时硬币数量有限制,为多重背包问题. 找零时硬币数量无限制,为完全背包问题*/#include<iostream> //多重背包和完全背包using namespace std; int main() { int n,t,euro[110],num[110],dp[30000],maxn; cin>>n>>t; int mx=0; for(int i=1;i<=n;++ 阅读全文

posted @ 2011-07-22 23:06 sysu_mjc 阅读(224) 评论(0) 推荐(0) 编辑

poj 3080 Blue Jeans

摘要: #include <iostream> //KMP+枚举#include<string>using namespace std;#define len 60char str[10][100],base[100]; int next[100]; void get_next(char B[],int t) //B[1]--B[t]{ next[1]=0; int j=0; for(int i=2;i<=t;++i) { while(j>0&&B[j+1]!=B[i]) j=next[j]; if(B[j+1]==B[i]) j=j+1; next 阅读全文

posted @ 2011-07-22 23:03 sysu_mjc 阅读(146) 评论(0) 推荐(0) 编辑

poj 3041 Asteroids

摘要: // 题意:N*N矩阵,有一些格子里有小行星,一颗炮弹能够消灭掉矩阵中一行或一列的全部小行星,// 问消灭掉所有小行星所需的最小炮弹数目。// 思路:令集合X和集合Y分别表示矩阵的行和列,将矩阵每一行看成集合X的点,每一列看成集合Y的点,// 如果第i行第j列有小行星则将Xi和Yj连一条边,这样就构成一个二分图,// 题目就是求二分图的最小覆盖点数(即最少的行和列),转化成二分图的最大匹配数#include<iostream> //求二分图的最小覆盖点数#include<cstring>using namespace std;int n;int edge[510][51 阅读全文

posted @ 2011-07-22 23:02 sysu_mjc 阅读(122) 评论(0) 推荐(0) 编辑

poj 3013 Big Christmas Tree

摘要: View Code #include<iostream> #include<deque>using namespace std;#define maxn 50002const __int64 inf=(__int64)1<<63-1; struct Edge { int v; int weight; int next;}Vertex[4*maxn]; int head[maxn],curr;int cases,v,e,i,j,edge[maxn][3],w[maxn];void add_edge(int s,int t,int w) //新增结点不用申请空间 阅读全文

posted @ 2011-07-22 23:01 sysu_mjc 阅读(179) 评论(0) 推荐(0) 编辑

poj 2704 Pascal's Travels

摘要: /*题意:在一个N×N的底盘上,每一格有一个非负整数,表示在那一格可以向右或向下走几步。问每次只能向右或向下走,从左上角的格子走到右下方的格子有多少种不同的方案。dp[i][j]表示到从左上角到(i,j)的方案数dp[i][j]+=(dp[i][u])+(dp[v][j]),1<=u<j, 1<=v<i,如果(i,u)能走到(i,j), (v,j)能走到(i,j)*/#include<iostream> //DP#include<cstring>using namespace std;char table[40][40];long lo 阅读全文

posted @ 2011-07-22 22:59 sysu_mjc 阅读(128) 评论(0) 推荐(0) 编辑

poj 2882 Food Cubes

摘要: //sicily3 1114. Food Cubes//一立方体,给出某些填充的三维点,求有多少孔穴 //要注意孔的定义:A hole is a continuous empty space surrounded by food cubes in all six directions.//如果某区域与边界相临,那么它不能算做是孔.宽搜遍历时会忽略掉这种特殊情况,得到的孔数目比答案要多//方法是扩大边界, 题意:all between 1 and 100 inclusive,所以可以扩大到 0-101。最后得到的孔的数目减去 1 即为答案//为什么扩大边界后只要减去 1 就可以了,分两种情况讨论 阅读全文

posted @ 2011-07-22 22:59 sysu_mjc 阅读(165) 评论(0) 推荐(0) 编辑

poj 2689 Prime Distance

摘要: //先建立素数表,再用这些素数去筛掉[L,U]区间内的合数#include <iostream> //线性筛素数#include<cmath>using namespace std; #define maxn 46341 //floor(sqrt(double(INT_MAX))+0.5)=46341bool isPrime[maxn+1]; int prime[10000],cnt; void makePrime() //快速线性筛法建立素数表 { memset(isPrime,true,sizeof(isPrime)); cn... 阅读全文

posted @ 2011-07-22 22:58 sysu_mjc 阅读(140) 评论(0) 推荐(0) 编辑

poj 2663 Tri Tiling

摘要: #include<iostream> //DP, 与sicily4 1121. Tri Tiling 完全相同#include<stdio.h>using namespace std;int dp[31]={1}; //0的时候就是不放置,是1...int main(){ for(int i=2;i<=30;i+=2) { dp[i]=3*dp[i-2]; //在3x2矩阵中可以有3种放置方法,表示[i-2,i]不与前面相连接,单独拼凑成 for(int j=0;j<=i-4;j+=2) dp[i]+=2*dp[j]; //当j=i-4,i-6...时,表示 阅读全文

posted @ 2011-07-22 22:57 sysu_mjc 阅读(132) 评论(0) 推荐(0) 编辑

poj 2632 Crashing Robots

摘要: #include<iostream> //简单模拟题,千万要注意所给表格的x,y轴表示法与一般的相反using namespace std;char ch,action;int pos[100000][2],dir[100000],vis[102][102];int k,a,b,x,y,n,m,d,robot,repeat;int main(){ cin>>k; while(k--) { cin>>a>>b>>n>>m; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;++i) 阅读全文

posted @ 2011-07-22 22:56 sysu_mjc 阅读(136) 评论(0) 推荐(0) 编辑

poj 2491 Scavenger Hunt

摘要: #include<iostream>#include<string>#include<map>using namespace std;string str[500][2];int main(){ int cases,v,i; cin>>cases; for(int id=1;id<=cases;++id) { scanf("%d",&v); map<string,string> col; for(i=1;i<v;++i) { cin>>str[i][0]>>str[i][ 阅读全文

posted @ 2011-07-22 22:54 sysu_mjc 阅读(181) 评论(0) 推荐(0) 编辑

poj 2484 A Funny Game

摘要: /*当n==1 || n==2时,明显先手必胜。当n==3时,明显先手必败。由于每次只可取1或2个,而取2个时,2个必须相邻,推断有:当n>3时,若n为偶数,先手无论如何取,后手可在先手对称的位置上取同等数量,于是先手必败。若n为奇数,先手取1个时,后手可在先手对称的位置上取2个,之后无论先手如何取,后手都可在先手对称的位置上取同等数量,先手必败。如果先手一开始取2个时,后手可在先手对称的位置上取1个,之后还剩下偶数个,可如上推出先手必败。故当 n>3时,先手必败*/#include<iostream>#include<stdio.h>using names 阅读全文

posted @ 2011-07-22 22:53 sysu_mjc 阅读(190) 评论(2) 推荐(0) 编辑

poj 2367 Genealogical tree

摘要: #include<iostream>//简单拓扑排序usingnamespace std;int n,side[102][102],in[102],path[102];int main(){ cin>>n; int a,rear=0; for(int id=1;id<=n;++id) { while(cin>>a&&a) { side[id][a]=1; in[a]++; } } for(int i=1;i<=n;++i) if(in[i]==0) ... 阅读全文

posted @ 2011-07-22 22:52 sysu_mjc 阅读(155) 评论(0) 推荐(0) 编辑

poj 2305 Basic remains

摘要: //在b进制下,求p%m,其中m, contains up to 9 digits,所以m是在int范围内//把p和m转化为十进制数,而p边转化边模m,这样余数是以十进制来表示,再转化成b进制输出即可#include <iostream>#include <string>using namespace std;int main(){ char s1[1002],s2[10]; int m,b; while(scanf("%d",&b)&&b) { scanf("%s%s",s1,s2); m=0; int 阅读全文

posted @ 2011-07-22 22:51 sysu_mjc 阅读(177) 评论(0) 推荐(0) 编辑

poj 2239 Selecting Courses

摘要: // 题意:一共有n门课程,每门课都有对应的几个可以选择的上课时间,为星期几的第几节。// 一个时间段只能上一门课,问最多可以选择几门课#include<iostream> //二分图的最大匹配#include<cstring>using namespace std;int edge[400][100],vis[100],link[100]; int find(int a){ for(int i=1;i<=84;++i) // V1子集下标范围[1,n],V2子集下标范围[1,84] { if( edge[a][i] ... 阅读全文

posted @ 2011-07-22 22:50 sysu_mjc 阅读(190) 评论(0) 推荐(0) 编辑

poj 2191 Mersenne Composite Numbers

摘要: #include<iostream>using namespace std;bool is_prime(int a){ if(a==1) return false; for(int i=2;i*i<=a;++i) if(a%i==0) return false; return true;}long long num[100]={1},ans[10];int main(){ int n; cin>>n; for(int i=1;i<64;++i) num[i]=num[i-1]*2... 阅读全文

posted @ 2011-07-22 22:49 sysu_mjc 阅读(184) 评论(0) 推荐(0) 编辑

poj 2226 Muddy Fields

摘要: /* 题意: 有R×C方阵,'*'表示洼地,需要铺上宽度为1的木板,长度不限, 木板只能横放或竖放.木板可以重叠,但不能覆盖'.'(草地) 求覆盖所有'*'的最少木板数. 思路:将所有横向且连续(一个或以上)的'*'看成一个点并对其进行编号,所有的编号都为集合X内的编号。 同样地,将所有的竖向且连续(一个或以上)的'*'看成一个点并对其编号,所有的编号都为集合Y内的编号 对于原图里的'*',设其在横向X编号为i,在竖向Y编号为j,则在点 Xi 和点 Yj 间连一条边, 这样构成一个二分图, 阅读全文

posted @ 2011-07-22 22:49 sysu_mjc 阅读(179) 评论(0) 推荐(0) 编辑

导航