20131013周赛
来源:互联网 发布:帮人淘宝推广怎么做 编辑:程序博客网 时间:2024/06/08 00:15
地址:http://www.bnuoj.com/bnuoj/contest_show.php?cid=3114
A题 : HDU 1969 二分
注意PI要用acos(-1.0)表示
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<iostream>const double pi = acos(-1.0);const double eps = 1e-6;using namespace std;double s[10005];int main(){ int i,n,f,t,ri,sum; double mid,max,min; scanf("%d",&t); while(t--) { max=min=0; scanf("%d%d",&n,&f); f++; for(i=0;i<n;i++) { scanf("%d",&ri); s[i]=ri*ri*pi; if(s[i]>max) max=s[i]; } while(max-min>=eps) { sum=0; mid=(max+min)/2; for(i=0;i<n;i++) sum+=s[i]/mid; if(sum<f) max=mid; else min=mid; } printf("%.4lf\n",mid); } return 0;}
B题:POJ 1852 水题
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<string.h>#include<ctype.h>#include<stack>#include<queue>#include<set>#include<algorithm>#include <limits.h>using namespace std;int a[100005];int main(){ int t,i,l,n,maxm,b; scanf("%d",&t); while(t--) { maxm=0; scanf("%d%d",&l,&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); b=min(l-a[i],a[i]); if(b>maxm) maxm=b; } sort(a,a+n); printf("%d %d\n",maxm,max(l-a[0],a[n-1])); } return 0;}
C题: HDU 2102 三维BFS
三维的BFS,看似麻烦其实也差不多,莫名其妙MLE了好几次
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<string.h>#include<ctype.h>#include<stack>#include<queue>#include<set>#include<algorithm>#include <limits.h>using namespace std;char mapp[2][11][11];int dir[4][2]= {-1,0,0,-1,1,0,0,1};typedef struct { int x,y,time,floor;}Node;int main(){ char x; int t,n,m; int ex,ey,ez; int c,i,j; scanf("%d",&c); while(c--) { scanf("%d%d%d",&n,&m,&t); x=getchar(); for(i=0; i<n; i++) { for(j=0; j<m; j++) { cin>>mapp[0][i][j]; if(mapp[0][i][j]=='P') { ex=0; ey=i; ez=j; } } } for(i=0; i<n; i++) { for(j=0; j<m; j++) { cin>>mapp[1][i][j]; if(mapp[1][i][j]=='P') { ex=1; ey=i; ez=j; } } } queue<Node>q; Node th,ne; th.x=0; th.y=0; th.floor=0; th.time=0; mapp[th.floor][th.x][th.y]='*'; q.push(th); int safe=0; while(!q.empty()) { th=q.front(); q.pop(); if(th.time>t) { break; } if(th.x==ey&&th.y==ez&&th.floor==ex) { safe=1; break; } for(i=0; i<4; i++) { ne.x=th.x+dir[i][0]; ne.y=th.y+dir[i][1]; ne.time=th.time+1; ne.floor=th.floor; if(ne.x<0||ne.y<0||ne.x>=n||ne.y>=m) continue; if(mapp[ne.floor][ne.x][ne.y]=='#') { mapp[ne.floor][ne.x][ne.y]='*'; ne.floor^=1; if(mapp[ne.floor][ne.x][ne.y]=='#') { mapp[0][ne.x][ne.y]=mapp[1][ne.x][ne.y]='*'; continue; } } if(mapp[ne.floor][ne.x][ne.y]=='.'||mapp[ne.floor][ne.x][ne.y]=='P') { q.push(ne); mapp[ne.floor][ne.x][ne.y]='*'; } } } if(safe) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0;}
D题: HDU 4337 DFS
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<iostream>const double pi = acos(-1.0);const double eps = 1e-6;using namespace std;int visit[160];int mapp[160][160];int n,lu[160],flag;bool dfs(int x,int t){ if(visit[x]) return false; lu[t]=x; visit[x]=1; if(t==n&&mapp[1][x]) { flag=1; return true; } else { for(int i=1;i<=n;i++) { if(mapp[i][x]&&!visit[i]) { if(dfs(i,t+1)) return true; } } } visit[x]=0; return false;}int main(){ int i,x,y,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(visit,0,sizeof(visit)); memset(mapp,0,sizeof(mapp)); for(i=0;i<m;i++) { scanf("%d%d",&x,&y); mapp[x][y]=1; mapp[y][x]=1; } flag=0; dfs(1,1); if(flag) { for(i=1;i<n;i++) printf("%d ",lu[i]); printf("%d\n",lu[i]); } else printf("no solution\n"); } return 0;}
E题:HDU 4325 线段树
这道题hdu数据超水,达不到10^9,10^5数组标记就能过,那时候不会线段树,这是之前的代码
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<string.h>#include<ctype.h>#include<stack>#include<queue>#include<set>#include<algorithm>#include <limits.h>using namespace std;int a[100005];int main(){ int t,n,m,i,j,s,e,k=1,x; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); scanf("%d%d",&n,&m); for(i=0;i<n;i++) { scanf("%d%d",&s,&e); for(j=s;j<=e;j++) a[j]++; } printf("Case #%d:\n",k++); for(i=0;i<m;i++) { scanf("%d",&x); printf("%d\n",a[x]); } } return 0;}
这是正确的做法:10^9树建不起来,需要用离散化,我想更加熟悉线段树就手敲了一发。我交题真的感觉没有任何问题,可是就是RE成狗,数组开小是T,数组开大就RE,超郁闷,最后根据网上的改自己的代码才AC,但是我依然没有发现我为何RE。还是觉得unique和lower_bound的离散化更加飘逸,我比较喜欢那种
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<map>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define MAXN 100100int sum[MAXN<<2],cover[MAXN<<2];int dat[MAXN*3];int x[MAXN],y[MAXN];int q[MAXN];map<int,int> mp;void pushdown(int rt){ if(cover[rt]){ cover[rt<<1] += cover[rt]; cover[rt<<1|1] += cover[rt]; sum[rt<<1] += cover[rt]; sum[rt<<1|1] += cover[rt]; cover[rt] = 0; }}void build(int l,int r,int rt){ sum[rt] = 0; cover[rt] = 0; if(l==r) return ; int m = (l+r)>>1; build(lson); build(rson);}void update(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R){ cover[rt]++; sum[rt]++; return ; } pushdown(rt); int m = (l+r)>>1; if(L<=m) update(L,R,lson); if(R>m) update(L,R,rson);}int query(int w,int l,int r,int rt){ if(l==r){ return sum[rt]; } pushdown(rt); int m = (l+r)>>1; if(w<=m) return query(w,lson); else return query(w,rson);}int main(){ int t,n,m,i,tot,k = 1; scanf("%d",&t); while(t--){ printf("Case #%d:\n",k++); tot = 0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ scanf("%d%d",&x[i],&y[i]); dat[++tot] = x[i]; dat[++tot] = y[i]; } for(i=1;i<=m;i++){ scanf("%d",&q[i]); dat[++tot] = q[i]; } sort(dat+1,dat+tot+1); int cnt = 0; dat[++cnt] = dat[1]; for(i=2;i<=tot;i++){ if(dat[i]!=dat[cnt]){ dat[++cnt] = dat[i]; } } build(1,cnt,1); for(i=1;i<=cnt;i++){ mp[dat[i]] = i; } for(i=1;i<=n;i++){ update(mp[x[i]],mp[y[i]],1,cnt,1); } for(i=1;i<=m;i++){ printf("%d\n",query(mp[q[i]],1,cnt,1)); } } return 0;}
F题: HDU 1231 最大连续子段和
方法很多
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<string.h>#include<ctype.h>#include<stack>#include<queue>#include<set>#include<algorithm>#include <limits.h>using namespace std;int a[10005],x,y;int maxsequence(int a[], int len){ int maxsum, maxhere; int xx,yy; xx=yy=x=y=a[0]; maxsum = maxhere =a[0]; for (int i=1; i<len; i++) { if (maxhere <= 0) { maxhere = a[i]; xx=yy=a[i]; } else { maxhere += a[i]; yy=a[i]; } if (maxhere > maxsum) { x=xx; y=yy; maxsum = maxhere; } } return maxsum;}int main(){ int k,i,maxm; while(scanf("%d",&k),k) { for(i=0; i<k; i++) scanf("%d",&a[i]); maxm=maxsequence(a,k); if(maxm<0) printf("%d %d %d\n",0,a[0],a[k-1]); else printf("%d %d %d\n",maxm,x,y); } return 0;}
G题:HDU 1412 水题
貌似题目本意是用STL去做
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<ctype.h>#include<algorithm>using namespace std;int a[20005];int main(){ int n,m,i; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n+m;i++) scanf("%d",&a[i]); sort(a,a+n+m); printf("%d",a[0]); for(i=1;i<n+m;i++) { if(a[i]!=a[i-1]) printf(" %d",a[i]); } printf("\n"); } return 0;}
H题:POJ 2001 字典树
才学的,做了几道题,直接套模板
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<string.h>#include<ctype.h>#include<stack>#include<queue>#include<set>#include<algorithm>#include <limits.h>#define PI acos(-1)#define MAX 26using namespace std;char str[1005][25];typedef struct Trie{ Trie *next[MAX]; int v; //根据需要变化};Trie root;void createTrie(char *str){ int len = strlen(str); Trie *p =&root, *q; for(int i=0; i<len; ++i) { int id = str[i]-'a'; if(p->next[id] == NULL) { q = new Trie; q->v = 0; for(int j=0; j<MAX; ++j) q->next[j] = NULL; p->next[id] = q; } p->next[id]->v++; p = p->next[id]; }}void findTrie(char *str){ int len = strlen(str); Trie *p =&root; for(int i=0; i<len; ++i) { int id = str[i]-'a'; p=p->next[id]; printf("%c",str[i]); if(p->v==1) break; } printf("\n");}int main(){ int i,n=0; while(scanf("%s",str[n])!=EOF) { createTrie(str[n++]); } for(i=0;i<n;i++) { printf("%s ",str[i]); findTrie(str[i]); } return 0;}
I题: POJ 3041 二分图匹配
也是才学的,模板题
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<string.h>#include<ctype.h>#include<stack>#include<queue>#include<set>#include<algorithm>#include<limits.h>#define PI acos(-1)using namespace std;bool mapp[505][505];bool visit[505];int link[505];int n;bool find(int v){ int i; for(i=1; i<=n; i++) { if(mapp[v][i]&&!visit[i]) { visit[i]=true; if(link[i]==0||find(link[i])) { link[i]=v; return true; } } } return false;}int main(){ int k,i,x,y,ans=0; scanf("%d%d",&n,&k); for(i=0;i<k;i++) { scanf("%d%d",&x,&y); mapp[x][y]=true; } for(i=1; i<=n; i++) { memset(visit,0,sizeof(visit)); if(find(i)) ans++; } printf("%d\n",ans); return 0;}
小结:这次周赛卡题了,我第一眼看到第三题标题是中文就点开了,结果被卡了很久,浪费了很多时间,不然应该还能做出A题和D题。卡题对心情影响挺大的,想做出来又觉得耽误了很多时间,不做出来又不甘心,有点蛋疼
- 20131013周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 周赛
- 130310周赛
- 130317 周赛
- 130331周赛
- java.lang.UnsupportedClassVersionError: com/pingan/jrkj/mapreduce/Tags : Unsupported major.minor ver
- socket 接收数据不全
- 定义一个函数求字符串的长度,要求该函数体内不能声明任何变量
- FeiYang(飞扬):Python实现的综合办公环境
- ACE_Svc_Handler与ACE_Event_Handler
- 20131013周赛
- 在scrollbox画什么样的控件,不会有句柄
- hibernate抓取策略
- 有关ActivityManager的关系结构
- 合并table相同单元格的jquery插件
- 杭电OJ——Let the Balloon Rise
- 为easyui combobox添加默认选项
- J2SE学习笔记:J2SE重点难点,数组排序、HashSet去重、HashMap遍历
- 2013-10-20【学习汇报】