第七周组队赛130825

来源:互联网 发布:优易数据网站 编辑:程序博客网 时间:2024/05/23 18:31
今晚和教主一组,教主太神,连A四题,而且都是1A!都是用暴搜过的,暴搜大王。。
A题:
给你多个立方体,最大能堆起几个(小的必须在上面,立方体可以旋转使所得面满足条件)
我写了好久,一直TLE,后来看了教主的,还是TLE,先不贴了,就是DFS呀,就是
B题:
给出n个点,任意找一点,使得这点带其他点的曼哈顿距离最短,可以知道这点的坐标肯定在这些点的组合当中
直接搜
代码:
#include <iostream>//B#include <stdio.h>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <map>#include <queue>#define lson l,mid,num<<1#define rson mid+1,r,num<<1|1using namespace std;const int M=1005;int x[M],y[M];int dis(int x,int y){int s=x-y;if(s<0)s=-s;return s;}int main(){int n,t=1;while(scanf("%d",&n)!=EOF){if(!n)break;memset(x,0,sizeof(x));memset(y,0,sizeof(y));for(int i=0; i<n; i++)scanf("%d%d",&x[i],&y[i]);sort(x,x+n);sort(y,y+n);int sumx=0,sumy=0;int xx=x[0],yy=y[0];for(int i=1; i<n; i++){sumx+=dis(x[i],x[0]);sumy+=dis(y[i],y[0]);}int sx,sy;for(int i=1; i<n; i++){sx=sy=0;for(int j=0; j<n; j++){if(j!=i){sx+=dis(x[j],x[i]);sy+=dis(y[j],y[i]);}}if(sx<sumx){sumx=sx;xx=x[i];}if(sy<sumy){sumy=sy;yy=y[i];}}printf("Case %d: (%d,%d) %d\n",t++,xx,yy,sumx+sumy);}return 0;}



D题:
是我见过的最暴的搜索了
如果是当场看到这题,肯定不敢这么敲,后面教主说A了,是直接暴力了,就直接了
代码:
#include <iostream>//D#include <stdio.h>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <map>#include <queue>#define lson l,mid,num<<1#define rson mid+1,r,num<<1|1using namespace std;const int M=20000;int x1[M],x2[M],x3[M],x4[M],x5[M],x6[M];void ff(){int st=0;for(int i=0;i<=15;i++){for(int j=0;j<=15;j++){for(int k=0;k<=15;k++){for(int x=0;x<=15;x++){for(int y=0;y<=15;y++){for(int z=0;z<=15;z++){if(i+j+k+x+y+z==15){x1[st]=i,x2[st]=j,x3[st]=k,x4[st]=x,x5[st]=y,x6[st]=z;st++;}}}}}}}}int main(){char s[3];int a,b,c,d,e,f,t=1;ff();while(scanf("%s",s)!=EOF){if(s[0]=='e')break;if(s[0]=='m'){scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);int i;for(i=0;i<=15504;i++){if(x1[i]==a && x2[i]==b && x3[i]==c && x4[i]==d && x5[i]==e && x6[i]==f){break;}}printf("Case %d: %d\n",t++,i);}else if(s[0]=='u'){int w;scanf("%d",&w);printf("Case %d: %d %d %d %d %d %d\n",t++,x1[w],x2[w],x3[w],x4[w],x5[w],x6[w]);}}return 0;}



G题:赛中跟队友讨论了好久,差点吵起来了,唉~以后多努力
不过我们那种方法会超时,赛后亮神说使用floyd先把所有关系的求出来,并且是最短路,再求就可以

#include <iostream>//G#include <stdio.h>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <map>#include <queue>#define lson l,mid,num<<1#define rson mid+1,r,num<<1|1using namespace std;#define inf 0x7fffffff#define eps 1e-8const int M=100001;double link[15][15];int num;void floyd(){for(int k=1; k<=num; k++){for(int i=1; i<=num; i++){for(int j=1; j<=num ; j++){if(link[i][k] == inf || link[k][j] == inf)continue ;link[i][j]= min(link[i][k]*link[k][j],link[i][j]);}}}}int main(){int n,t=0;while(cin>>n,n){t++;map<string,int>st;string ss[10];for(int i=0; i<15; i++){for(int j=0; j<15; j++){link[i][j]=inf;}link[i][i]=1;}num=0;for(int kk=1; kk<=n; kk++){string s1,s2;int a,b;char op;cin >> a >> s1 >> op >> b >> s2 ;if(!st[s1]){st[s1]=++num;ss[num]=s1;}if(!st[s2]){st[s2]=++num;ss[num]=s2;}int x=st[s1];int y=st[s2];link[x][y]=min(link[x][y],1.0*b/a);//WA的原因把它两求反了link[y][x]=min(link[y][x],1.0*a/b);}int aa;string bb;cin>>aa>>bb;floyd();int gg=st[bb];double sum=inf;int ff=gg,jj=0;for(int i=1; i<=num; i++){if(i!=gg && link[gg][i]!=inf){int sd=ceil(1.0*aa*link[gg][i]-eps);double cs=sd * link[i][gg];//一直WA个不停,没定义成doubleif(cs > 100000)continue;if(cs<sum && cs>=0){ff=i;jj=sd;sum=cs;}}}printf("Case %d: %d %s\n",t,jj,ss[ff].c_str());}return 0;}



原创粉丝点击