这半个月感觉状态不太好,连续两次周赛迟到虽然时间不长但是不管是不是有什么其他因素都是不应该的。并不忙,可是过的有点浑浑噩噩的感觉。难道是因为男人每个月都有那么半个月?在尽快调整。
1013周赛
A.hdu 1969 二分法,以前对二分有阴影,这次wa四次不知道怎么回事,后来知道了逗比的我#define pi 3.14159265359 ,实际上pi=acos(-1.0)
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <math.h> #define pi acos(-1.0) using namespace std; int main() { int tot; int pp; int ff; double maxx; double minn; double aa[10005]; scanf("%d",&tot); double xx; double recent; for(int ii=0;ii<tot;ii++) { recent=0; scanf("%d%d",&pp,&ff); ff++; for(int i=0;i<pp;i++) { scanf("%lf",&xx); aa[i]=xx*xx*pi; recent+=aa[i]; } maxx=recent/ff; minn=0; double cen; while(maxx-minn>0.0000001) { cen=(maxx+minn)/2; int tot=0; for(int i=0;i<pp;i++) { tot+=int(aa[i]/cen); } if(tot>=ff) minn=cen; else maxx=cen; } printf("%.4lf\n",minn); } }
B.poj 1852 想法题.不贴了
C.hdu 2102
bfs,刚开始没有考虑到最后怎么也达不到的情况 wa了
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <stack> #include <map> #include <queue> #include <cmath> using namespace std; struct point { int x,y,z; int step; }; int aa,bb,cc; int cango(int x,int y,int z) { if(x>=0&&x<2&&y>=0&&y<aa&&z>=0&&z<bb) return 1; return 0; } int dir1[4][3]={{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; int dir2[2][3]={{1,0,0},{-1,0,0}}; int vv[3][12][12]; char ss[3][12][12]; point st,en; int t; int bfs() { int judge=0; queue <point> pp; while(!pp.empty()) pp.pop(); point s1,s2; st.x=0;st.y=0;st.z=0; st.step=0; pp.push(st); int judge1=0; vv[0][0][0]=1; while(!pp.empty()) { //cout<<"1"<<" "; s1=pp.front(); pp.pop(); if(s1.x==en.x&&s1.y==en.y&&s1.z==en.z&&s1.step<=cc) { printf("YES\n"); judge=1; return 0; } if(ss[s1.x][s1.y][s1.z]=='#') { for(int i=0;i<2;i++) { s2.x=s1.x+dir2[i][0]; s2.y=s1.y+dir2[i][1]; s2.z=s1.z+dir2[i][2]; s2.step=s1.step; if(cango(s2.x,s2.y,s2.z)&&(ss[s2.x][s2.y][s2.z]=='.'||ss[s2.x][s2.y][s2.z]=='P')&&vv[s2.x][s2.y][s2.z]==0) { pp.push(s2); vv[s2.x][s2.y][s2.z]=1; } } } else for(int i=0;i<4;i++) { s2.x=s1.x+dir1[i][0]; s2.y=s1.y+dir1[i][1]; s2.z=s1.z+dir1[i][2]; s2.step=s1.step+1; if(cango(s2.x,s2.y,s2.z)&&(ss[s2.x][s2.y][s2.z]=='.'||ss[s2.x][s2.y][s2.z]=='P'||ss[s2.x][s2.y][s2.z]=='#')&&vv[s2.x][s2.y][s2.z]==0) { pp.push(s2); vv[s2.x][s2.y][s2.z]=1; } } } if(judge1==0) printf("NO\n"); } int main() { scanf("%d",&t); for(int i=0;i<t;i++) { memset(vv,0,sizeof(vv)); memset(ss,0,sizeof(ss)); scanf("%d%d%d",&aa,&bb,&cc); { for(int i=0;i<2;i++) for(int j=0;j<aa;j++) { scanf("%s",ss[i][j]); for(int k=0;k<bb;k++) if(ss[i][j][k]=='P') { en.x=i;en.y=j;en.z=k; en.step=cc; } } bfs(); } } }
D.hdu 4337
dfs没什么难度,比赛中没去做
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <math.h> #include <set> #include <map> #include <vector> using namespace std; int pp,rr; int aa,bb; int ans; int judge; int ss[155][155]; int vv[155]; int re[155]; int dfs(int x) { if(judge==1) return 0; re[ans]=x; if(ans==pp) { if(ss[x][1]==1) { judge=1; printf("%d",re[1]); for(int i=2;i<=pp;i++) printf(" %d",re[i]); printf("\n"); } return 0; } for(int i=1;i<=pp;i++) { if(i==x) continue; if(ss[i][x]==1&&vv[i]==0) { vv[i]=1; ans++; dfs(i); ans--; vv[i]=0; } } } int main() { while(scanf("%d%d",&pp,&rr)!=EOF) { memset(re,0,sizeof(re)); memset(vv,0,sizeof(vv)); memset(ss,0,sizeof(ss)); for(int i=0;i<rr;i++) { scanf("%d%d",&aa,&bb); ss[aa][bb]=1; ss[bb][aa]=1; } vv[1]=1; judge=0; ans=1; dfs(1); } }
E.hdu4325 水过的不贴了
F hdu 1231简单DP
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <stack> #include <map> #include <queue> #include <cmath> using namespace std; int main() { int num[10005]; int tt[10005]; int first[10005]; int tot; while(scanf("%d",&tot)&&tot) { memset(num,0,sizeof(num)); memset(tt,0,sizeof(tt)); memset(first,0,sizeof(first)); scanf("%d",&num[0]); tt[0]=num[0]; first[0]=0; for(int i=1;i<tot;i++) { scanf("%d",&num[i]); first[i]=i; tt[i]=num[i]; } for(int i=1;i<tot;i++) {if(tt[i-1]+num[i]>num[i]) { first[i]=first[i-1]; tt[i]=tt[i-1]+num[i]; } } int ans=-0x7ffffff; int judge=0; for(int i=0;i<tot;i++) { if(tt[i]>ans) { ans=tt[i]; judge=i; } } if(ans<0) printf("0 %d %d\n",num[0],num[tot-1]); else printf("%d %d %d\n",ans,num[first[judge]],num[judge]); } }
G.hdu 1412
排序水过的,刚开始用set做的,后来没处理好空格问题,后来知道了,不贴了
H.poj 2001
字典树,模板题,算法好理解.
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define MAX 26 using namespace std; 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'; //cout<<id<<endl; if(p->next[id] == NULL) { q = new Trie; q->v = 1; for(int j=0; j<MAX; j++) q->next[j] = NULL; p->next[id] = q; p = q; } else { p->next[id]->v++; p = p->next[id]; } } } int 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"); return 0; } int dealTrie(Trie* T) { int i; if(T==NULL) return 0; for(i=0;i<MAX;i++) { if(T->next[i]!=NULL) dealTrie (T->next[i]); } free(T); return 0; } int main() { char aa[1005][35]; int ii=0; while(cin>>aa[ii]) { createTrie(aa[ii]); ii++; } for(int i=0;i<ii;i++) { printf("%s ",aa[i]); findTrie(aa[i]); } }
I.poj 3041
二分图最大匹配,模板题+1,继续研究中
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<ctype.h> #include<algorithm> #include<string> #define PI acos(-1.0) #define maxn 505 #define maxe 10005 #define INF 1<<25 typedef long long ll; using namespace std; int G[maxn][maxn]; int Y[maxn]; int next[maxn]; int tot,tt; int ans; int init() { int xx,yy; memset(G,0,sizeof(G)); memset(next,-1,sizeof(next)); ans = 0; scanf("%d%d",&tot,&tt); for(int i=0;i<tt;i++) { scanf("%d%d",&xx,&yy); G[xx][yy]=1; } } int findset(int x) { for(int i=1;i<=tot;i++) { if(G[x][i]&&!Y[i]) { Y[i]=1; if(next[i]==-1||findset(next[i])) { next[i]=x; return 1; } } } return 0; } int main() { init(); for(int i=1;i<=tot;i++) { memset(Y,0,sizeof(Y)); if(findset(i)) ans++; } printf("%d\n",ans); return 0; }
1020周赛
1001.hdu 1395 暴力过,2的倍数和1 impossible
1002.hdu 2161 筛选法求素数
1003.hdu 2674 41!以后就是2009的倍数了.
1004.hdu 1576
扩展欧几里得算法,可以熟练运用了
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<ctype.h> #include<algorithm> #include<string> #define PI acos(-1.0) #define maxn 160 #define INF 1<<25 using namespace std; int xx,yy; int gcd(int a,int b) { if(a<b) { int t=b; b=a; a=t; } if(b==0) return a; return gcd(b,a%b); } int q; int extend_Eulid(int a,int b) { if(b == 0) { xx = 1; yy = 0; q=a; } else { int r=extend_Eulid(b,a%b); int temp = xx; xx = yy; yy = temp - a/b*yy; } } int main() { int tot; int ans; int a; scanf("%d",&tot); for(int i=0; i<tot; i++) { scanf("%d%d",&ans,&a); extend_Eulid(a,9973); xx*=ans; xx=(xx%9973+9973)%9973; printf("%d\n",xx); } }
1005.hdu 1262
还是筛选法求素数的应用
1006.hdu 1163
直接对9取余,很好理解的问题
1007.hdu 2824
欧拉函数,学习以后找到一些类似的模板题,可以手写
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<ctype.h> #include<algorithm> #include<string> #define PI acos(-1.0) #define maxn 160 #define INF 1<<25 #define N 3000005 typedef __int64 ll; using namespace std; ll num [N]; int main() { for(int i=1;i<=N;i++) num[i]=i; for(int i=2;i<=N;i++) { if(num[i]==i) { for(int j=i;j<=N;j+=i) { num[j]/=i; num[j]*=(i-1); } } } int aa,bb; while(scanf("%d%d",&aa,&bb)!=EOF) { ll ans=0; for(int i=aa;i<=bb;i++) { ans+=num[i]; } printf("%I64d\n",ans); } }
没算好时间,停电了,又摸黑打了一会字,郁闷。早睡早起身体好