#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
转载 2011-07-21 21:38:00
56阅读
// 题意:有n个导弹,假若能摧毁4个导弹,则高度的要求:后面摧毁的导弹坐标要靠后// 而且第2个导弹比第1个导弹低,第3个导弹比第2个导弹高,第4个导弹比第3个导弹低// 即是偶数位的要比前面的低,而奇数位的要比前面的高#include<iostream> //DP, 最小不单调子序列, O(n^2)的时间复杂度,n<=1000,数据规模较小using namespace std;int n,h[1002],ans[1002][2]; // ans[i][0]表示以第i个数作为结束摧毁导弹的最大数量,此时第i个数在顺序上是偶,而ans[i][1]则表示第i个数在顺...
转载 2011-07-21 17:01:00
148阅读
#include<iostream>//模拟题#include<set>usingnamespacestd;intout[100000],query[100000];boolfirst;intmain(){intmax_cost,len;while(cin>>max_cost){cin>>len;for(inti=0;i<len;++i)cin>>query[i];charch;intp=1,x,r=1;set<int>col;while(cin>>ch,ch!='e'){if(ch==&
转载 2011-07-13 00:30:00
55阅读
//拓扑排序#include <iostream> //邻接表实现#include <string.h>#include <numeric>using namespace std;#define MAXN 10002#define MAXM 20002int in[MAXN],path[MAXN],wei[MAXN];int u[MAXM],v[MAXM],first[MAXM],Next[MAXM]; //first[u]保存结点u的第一条边的编号,next[e]表示编号为e的边的“下一条边”的编号int main(){ int n,m; cin>&
转载 2011-07-09 03:02:00
117阅读
#include<iostream> //赤裸裸的0-1背包问题using namespace std;int main(){ int t,n,m,item,dp[10010]; cin>>t; while(t--) { cin>>n>>m; fill(dp,dp+m+1,0); while(n--) { cin>>item; for(int i=m;i>=item;--i) dp[i]=max(dp[i],dp[i-item]+item); } cout<<dp[m]<<endl; } return 0
转载 2011-07-07 12:26:00
76阅读
//要注意输出格式,先前是形成每个字母或空格都立即输出, PE 多次后发现除了最后一个是空格外,(不完全的组合或超出字母表示范围)//有可能最后第二个也是空格, "You should throw away any trailing spaces" 说明最后第二个也不能输出空格//所以要用一数组out记录编码,然后去除掉最后边的空格(无论有多少个)#include<iostream>#include<cstring>using namespace std;int vis[30][30],table[30][30];char out[100];int
转载 2011-07-05 01:55:00
72阅读
#include<iostream>#include<stdio.h>using namespace std;int main(){ int column,row,length,i,time; char ch,list[100][20]; while(scanf("%d",&column),column) { scanf("\n"); length=i=0; while(scanf("%c",&ch),ch!='\n') { length++; list[(length-1)/c
转载 2011-07-04 18:33:00
69阅读
//给出三个字符串,判断第三个字符串是否可以由前两个字符串组成,//注意前两个字符串中的字母在新组成的字符串中的顺序和在原来字符串中的顺序一样.#include <iostream>#include<stdio.h>#include<cstring>using namespace std;char s1[210],s2[210],goal[410];int f[210][210]; //记录状态//f[i][j]有三种可能取值,-1表示初始化,即不清楚能否匹配成功,0表示匹配不成功,1表示匹配成功bool match(int i,int j) //判断s1的
转载 2011-07-04 12:15:00
82阅读
// 由于方格翻转两次就相当没有翻转,所以翻转的次数只可能取0,1,要么没翻,要么翻1次,// 这样初始状态为"wwwwwwwww",我们可以计算出每种翻转可能组合的结果,// 比如翻转 2459 后变成 bbwbwbwbw,那我们可以标记 bbwbwbwbw 的答案为 2459,// 因为 bbwbwbwbw 翻转 2459 后会变成 wwwwwwwww #include<iostream> //数据量小,直接枚举#include<cstring>#include<vector>using namespace std;int mov[1
转载 2011-07-21 11:59:00
98阅读
#include <iostream> //DP#include <numeric>using namespace std;#define ed 105int ai[ed],pi[ed],dp[ed]; int main(){ int t,c; cin>>t; while(t--) { cin>>c; for(int i=1;i<=c;++i) cin>>ai[i]>>pi[i]; fill(dp,dp+ed,100000000); //初始化为极大值 dp[0]=0; for(int i=1;i<=c;++i
转载 2011-07-21 01:43:00
56阅读
#include<iostream> #include <string>#include<cstdio>using namespace std;int main(){ int T,N,l,i,j; string str[8]; cin>>T; for(l=0;l<T;l++) { scanf("%d",&N); for(i=0;i<N;i++) cin>>str[i]; for(i=0;i<N;i++) for(j=i+1;j...
转载 2011-08-30 11:30:00
56阅读
#include<iostream>#include<cmath>using namespace std;int gcd(int a,int b){ int r; while(b>0) { r=a%b; a=b;b=r; } return a;}int main(){ int a,b,c; while(cin>>a>>b&&a) { c=b/a; for(int i=sqrt(double(c));i>=1;--i) if(c%i==0&&gcd(c/i,i)==1) { cout<<a*(
转载 2011-07-14 19:22:00
29阅读
#include<iostream> //递推关系#include<cstring>using namespace std;int ans[1000],sum[1000],out[1000];int main(){ ans[1]=ans[2]=1; sum[1]=1;sum[2]=2; int r=2; while(sum[r]<90000000) { ++r; ans[r]=ans[r-1]+ans[r-2]; sum[r]=ans[r]+sum[r-1]; } int cases,n,i,res[1000],t; cin>>cases; while
转载 2011-07-14 15:53:00
123阅读
#include<iostream>//只要把n转化成二进制数,在各位置上乘以对应的系数就好了.比如k=3,n=6=110,则s=1*(3^2)+1*(3^1)+0*(3^0)=12,这好理解,就是把n的二进制看作是k进制的#include<cmath>usingnamespacestd;intmain(){intk,n,arr[100];while(cin>>k>>n){intr=0,s=0;while(n>0)//n转化成二进制{arr[r++]=n%2;n/=2;}for(inti=0;i<r;++i)s+=pow(double
转载 2011-07-13 16:18:00
31阅读
// 题意:找出最小生成树的最大边#include<iostream> //最小生成树Prim算法using namespace std;struct MST //最小生成树的边{ int st,ed,w;}mst[1000];int n,edge[1000][1000];int ans; //ans保存最小生成树的最长边void Prim(){ int i,j,k; for(i=0;i<n-1;i++) //默认选择节点0加入生成树 { mst[i].st=0;mst[i].ed=i+1; mst[i...
转载 2011-07-12 16:33:00
66阅读
/*题意: 给定n和m, 求有多少x(m<=x<=n),满足 gcd(x,n)>=m. 可以利用欧拉函数来解答. 令 y = gcd ( x , n ),其中 y>=m ,则有 gcd(x/y,n/y)=1 .于是对于特定的y,我们想求有多少 x 满足 gcd(x,n)=y, 只要求出有多少 x/y 小于 n/y 且与 n/y 互质——这正是欧拉函数的定义:φ(a) 表示小于a且和a互质的正整数的个数思路: 先求出 n 大于等于 m 的因子 y ,再计算 n/y 的欧拉函数,最后相加即可*/#include<iostream> #include <ma
转载 2011-07-12 01:00:00
61阅读
#include<iostream> //计算多边形面积(利用向量叉乘)#include<stdio.h>#include<cmath>using namespace std;struct Point { double x, y;}p[10000];double polygon_area(int n){ double area=0; for(int i=0;i<n-1;++i) { area+=p[i].x*p[i+1].y-p[i].y*p[i+1].x; } area+=p[n-1].x*p[0].y-p[n-1].y*p[0].x; return
转载 2011-07-10 22:46:00
71阅读
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int num[25],n,m,a,b; 8 while(cin>>n>>m&&n) 9 {10 memset(num,0,sizeof(num));11 while(m--)12 {13 cin>>a>>b;14 num[a]++;num[b]++;15 }16 cout<<
转载 2011-07-10 21:19:00
73阅读
//ans[1]-ans[6]分别记录 东 西 北 南 上 下 的值,我们可以确定最后一定要转到://ans[1]=1,ans[3]=2,即 the east face is 1, the north face is 2, //为了判断是 left或是 right ,我们要先把 东 面转到 1 ,再把 北 面转到 2,//最后如果 上 面是3,则是right; 如果 下 面是3,则是left#include<iostream>#include<stdio.h>using namespace std;int main(){ char ch[10]; int ans[10]
转载 2011-07-05 02:25:00
131阅读
//给出不同半径的半圆,问其中是否有某些半圆可以构成一个封闭的图形//如果半圆的直径能构成多边形,或者是线段重合在一起,都符合封闭的定义//于是对各半径排序(升序)后只要检查到某条边小于或等于前面边之和#include<iostream>#include<stdio.h>#include<algorithm>usingnamespacestd;doubleans[20];intmain(){intn;while(cin>>n&&n){for(inti=0;i<n;++i)cin>>ans[i];sort(ans,
转载 2011-07-05 02:20:00
40阅读
  • 1
  • 2
  • 3
  • 4
  • 5