HDU 4946 Area of Mushroom
这题WA了7发才过,队友做的,然后一起debug了好久。
刚開始是没排序。
然后是在同一个位置的点没有处理好。
然后把这两个问题搞定就A了。
#include <algorithm> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <ctype.h> #include <iostream> #include <map> #include <queue> #include <set> #include <stack> #include <string> #include <vector> #define eps 1e-10 #define INF 0x7fffffff #define maxn 10005 #define PI acos(-1.0) #define seed 31//131,1313 typedef long long LL; typedef unsigned long long ULL; using namespace std; int x[505],y[505],v[505],vis[505]; int cmp(double x) { if(fabs(x)<eps) return 0; if(x>0) return 1; return -1; } inline double sqr(double x) { return x*x; } struct point//点 { double x,y; int pos; int o; point() {} point(double a,double b):x(a),y(b) {} void input() { scanf("%lf%lf",&x,&y); } friend point operator + (const point &a,const point &b) { return point(a.x+b.x,a.y+b.y); } friend point operator - (const point &a,const point &b) { return point(a.x-b.x,a.y-b.y); } friend bool operator == (const point &a,const point &b) { return cmp(a.x-b.x)==0 &&cmp(a.y-b.y)==0; } friend point operator * (const point &a,const double &b) { return point(a.x*b,a.y*b); } friend point operator * (const double &a,const point &b) { return point(a*b.x,a*b.y); } friend point operator / (const point &a,const double &b) { return point(a.x/b,a.y/b); } double norm() { return sqrt(sqr(x)+sqr(y)); }//到原点距离 void out () const { printf("%.2f %.2f",x,y); } } p[505]; double det (const point &a,const point &b) { return a.x*b.y-a.y*b.x; }//叉积 double dot (const point &a,const point &b) { return a.x*b.x+a.y*b.y; }//点乘 double dist (const point &a,const point &b) { return (a-b).norm(); }//距离 point rotate_point(const point &p,double A) { double tx=p.x,ty=p.y; return point (tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A)); }//旋转,A是弧度 struct polygon_convex { vector <point> P; polygon_convex(int size=0) { P.resize(size); } } p_c; bool comp_less(const point &a,const point &b) { return cmp(a.x-b.x)<0||cmp(a.x-b.x)==0&&cmp(a.y-b.y)<0; } polygon_convex convex_hull(vector <point> a) { polygon_convex res(2*a.size()+5); sort(a.begin(),a.end(),comp_less); a.erase(unique(a.begin(),a.end()),a.end()); int m=0; for(int i=0; i<a.size(); i++) { while(m>1 && cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<0) m--; res.P[m++]=a[i]; } int k=m; for(int i=int(a.size())-2; i>=0; i--) { while(m>k && cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<0) m--; res.P[m++]=a[i]; } res.P.resize(m); if(a.size()>1) res.P.resize(m-1); return res; } bool cmp3(point a,point b) { return a.x<b.x||((a.x==b.x)&&(a.y<b.y)); } int main() { int T,tt=0; while(scanf("%d",&T)) { tt++; vector<point>pp; pp.clear(); memset(vis,0,sizeof(vis)); if(T==0) break; int pos=-1; int max_v=0; for(int i=1; i<=T; i++) { scanf("%d%d%d",&x[i],&y[i],&v[i]); if(v[i]>max_v) max_v=v[i]; } int top=0; for(int i=1; i<=T; i++) { if(v[i]==max_v) { p[top].x=(double)x[i]; p[top].y=(double)y[i]; p[top].pos=i; p[top].o=0; top++; } } printf("Case #%d: ",tt); if(max_v==0) { for(int i=1; i<=T; i++) printf("0"); printf("\n"); continue; } sort(p,p+top,cmp3); for(int i=0; i<top; i++) { if((i<top-1&&(p[i].x)==(p[i+1].x)&&(p[i].y)==(p[i+1].y))||(i>0&&(p[i].x)==(p[i-1].x)&&(p[i].y)==(p[i-1].y))) p[i].o=1; } pp.push_back(p[0]); for(int i=1; i<top; i++) { if(p[i].x!=p[i-1].x||p[i].y!=p[i-1].y) pp.push_back(p[i]); } if(pp.size()<=3) { for(int i=0; i<pp.size(); i++) if(pp[i].o==0) vis[pp[i].pos]=1; } else { polygon_convex ans=convex_hull(pp); for(int i=0; i<ans.P.size(); i++) { //cout<<ans.P[i].ok<<" "<<ans.P[i].pos<<endl; if(ans.P[i].o==0) vis[ans.P[i].pos]=1; } } for(int i=1; i<=T; i++) printf("%d",vis[i]); printf("\n"); } return 0; } /* 3 2 2 3 2 2 3 2 3 3 6 1 1 3 1 -1 3 2 0 3 -1 1 3 -1 -1 3 -2 0 3 4 1 1 1 1 2 1 1 3 1 1 4 1 15 1 1 0 1 1 1 2 1 1 3 1 1 4 1 1 5 1 1 5 2 1 5 3 1 5 4 1 4 4 1 3 4 1 2 4 1 1 4 1 1 3 1 1 2 1 9 1 4 1 1 3 1 1 2 1 1 1 1 2 1 1 3 1 1 4 1 1 3 2 1 2 3 1 */
HDU 4948 Kingdom
这题比赛的时候遗憾了。我看了这道题。然后认为挺简单的。
刚開始一看题上,想到的就是拓扑排序。然后脑子想啊想……感觉就是拓扑排序的逆序。然后发现挺水的……
由于说了要想发展某个城市的话,就必须有还有一个城市作为它发展的前提,即城市u->w这样连边,表示要想发展城市w,前提是u已经是发展过的城市了。那这种话不是非常easy嘛。
即统计出出度最多的就是第一个要发展的城市了。由于u->w这样连边能够看出算出出度最多的依次从大到小排序即可了。
哎呀。只是可惜了。由于看见没人交这题。然后也不敢把自己想的告诉队友,然后自己也没敲……然后错过进第一版的机会了真是被第一梯队的带错路被坑了……
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define llson j<<1,l,mid #define rrson j<<1|1,mid+1,r #define INF 0x7fffffff #define maxn 11010 using namespace std; typedef long long ll; typedef unsigned long long ull; char s[500][505]; struct abc { int i,out; bool operator<(const abc &a)const { return out>a.out; } }a[501]; int main() { //freopen("1.txt","r",stdin); int n,i,j; while(scanf("%d",&n)&&n) { for(i=0;i<n;i++) scanf("%s",s[i]),a[i].i=i,a[i].out=0; for(i=0;i<n;i++) for(j=0;j<n;j++) if(s[i][j]=='1') a[i].out++; sort(a,a+n); printf("%d",a[0].i+1); for(i=1;i<n;i++) printf(" %d",a[i].i+1); puts(""); } return 0; }
HDU 4951 Multiplication table
乘法表。
看每行。两个数都相等的就是0了。
然后看第一位不相等的个数,多少个不同就是哪个数了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define llson j<<1,l,mid #define rrson j<<1|1,mid+1,r #define INF 0x7fffffff #define maxn 11010 using namespace std; typedef long long ll; typedef unsigned long long ull; int a[511][1011],vis[511]; int main() { //freopen("1.txt","r",stdin); int n,i,j,ii=1; while(scanf("%d",&n)&&n) { int flag,b[512]; for(i=0; i<n; i++) { for(j=0,flag=0; j<n; j++) { scanf("%d%d",&a[i][j<<1],&a[i][j<<1|1]); if(a[i][j<<1]!=a[i][j<<1|1]) flag++; } if(!flag) b[0]=i; } for(i=0;i<n;i++) { if(i==b[0]) continue; mem(vis,0); int sum=0; for(j=0;j<(n<<1);j+=2) if(!vis[a[i][j]]) sum++,vis[a[i][j]]=1; b[sum]=i; } printf("Case #%d: %d",ii++,b[0]); for(i=1;i<n;i++) printf(" %d",b[i]); puts(""); } return 0; }
HDU 4952 Number Transformation
这题规律题,输出前面100个值与倍数就会发现往后的倍数都是一样的了,倍数一样就是每次都加同样的数到最后,这种话就变成简单的乘法了。
代码中凝视的三句就是用来找规律的。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define INF 10000010 #define maxn 80010 using namespace std; typedef long long ll; typedef unsigned long long ull; int main() { ll n,m; int ans=1; while(scanf("%I64d%I64d",&n,&m)&&(n||m)) { //int cnt=0; ll a=-1,b=-1,sum=0,i; int flag=0; for(i=2LL;i<=m;i++) { if(n%i) { b=n/i+1LL; n=b*i; //if(cnt++<100) //cout<<"+++ "<<n<<' '<<(int)(n/i)<<' '<<i<<endl; if(b==a) break; else a=b; flag=1; } } if(flag&&i<m) { sum=m-i; sum=sum*a+n; } else sum=n; printf("Case #%d: %I64d\n",ans++,sum); } return 0; }