20130825组队赛-2012 East Central Regional Contest

来源:互联网 发布:非农数据与黄金走势 编辑:程序博客网 时间:2024/05/21 09:11

暴力的专场:

 

A.  Babs' Box Boutique

 

   对于每一个立方体暴力枚举其拥有的三个面,只有十个立方体,暴力可以过的:

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;struct node{    int l,w;} SA[50],SB[50];int bian[15][4];int n;int s[15];int dix[3]= {0,0,1};int diy[3]= {1,2,2};int ans;bool cmp(node a,node b){    if(a.l == b.l)        return a.w < b.w;    else        return a.l < b.l;}void DFS(int u){    if(u == n)    {        for(int i = 0; i < n; i++)            SB[i] =SA[i];        sort(SB, SB+n, cmp);        memset(s, 0, sizeof(s));        for(int i = 0; i < n; i++)        {            s[i] = 1;            for(int j = i-1; j >= 0; --j)            {                if(SB[i].w >= SB[j].w && s[i] < s[j]+1)                {                    s[i] = s[j]+1;                    if(ans < s[i])                        ans = s[i];                }            }        }        return;    }    for(int i = 0; i <3; ++i)    {        SA[u].l = bian[u][dix[i]];        SA[u].w = bian[u][diy[i]];        if(SA[u].l >SA[u].w)            swap(SA[u].l, SA[u].w);        DFS(u + 1);    }}int main(){    int cnt = 0;    while(scanf("%d", &n))    {        if(!n)            break;        cnt ++;        for(int i = 0; i < n; ++i)            scanf("%d%d%d", &bian[i][0], &bian[i][1], &bian[i][2]);        ans = 0;        DFS(0);        printf("Case %d: %d\n", cnt, ans);    }    return 0;}


 

B.  Flash Mob

 

    这道题目搞了好久,我们一开始一直在匹配x和y值,一直WA,后来用三分过的。第二天写了一下,发现直接找

到中间点也是可以的,对于曼哈顿距离(求解x和xi的距离之差的和,以及y与yi的距离之差的和),枚举x和Y的情

况,我们一直WA的错误是没有进行距离初始化,把距离初始化为所有的点到第一点的距离之后,再次暴力枚举x和y,

A了。水了尴尬

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;#define N 1050#define INF 99999999int numx[N];int numy[N];int MINX;int MINY;int MIN;int n;int main(){    int cnt = 0;    while(scanf("%d", &n))    {        if(!n)            break;        memset(numx, 0, sizeof(numx));        memset(numy, 0, sizeof(numy));        cnt ++;        for(int i = 1; i <= n; ++i)        {            scanf("%d", &numx[i]);            scanf("%d", &numy[i]);        }        int sumx = 0;        int sumy = 0;        int sum;        sort(numx+1, numx + n+1);        sort(numy+1, numy + n+1);        for(int i = 1; i <= n; ++i)        {            sumx += abs(numx[i] - numx[1]);            sumy += abs(numy[i] - numy[1]);        }        MINX = numx[1];        MINY = numy[1];        for(int i = 2; i <= n; ++i)        {            sum = 0;            for(int j = 1; j <= n; ++j)                sum += abs(numx[i] - numx[j]);            if(sum < sumx)            {                sumx = sum;                MINX = numx[i];            }        }        for(int i = 2; i <= n; ++i)        {            sum = 0;            for(int j = 1; j <= n; ++j)            {                sum += abs(numy[i] - numy[j]);            }            if(sum < sumy)            {                sumy = sum;                MINY = numy[i];            }        }        printf("Case %d: (%d,%d) %d\n", cnt, MINX, MINY, sumx + sumy);    }    return 0;}


 

直接求中点:

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int gcd(int n,int m){    if(n<m) swap(n,m);    return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){    if(n<m) swap(n,m);    return n/gcd(n,m)*m;}#define N 2000int prime[N];struct node{    int data[6];} num[N];void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);int numx[N];int numy[N];int MIN;int n;int solve(int x, int y){    int ans = 0;    for(int i = 1; i <= n; ++i)    {        ans += abs(numx[i]-x);        ans += abs(numy[i]-y);    }    return ans;}int main(){    int cnt = 0;    while(scanf("%d", &n))    {        if(!n)            break;        cnt++;        for(int i = 1; i <= n; ++i)            scanf("%d%d", &numx[i], &numy[i]);        sort(numx+1, numx+n+1);        sort(numy+1, numy+n+1);        int MINX = numx[(n+1)/2];        int MINY = numy[(n+1)/2];        MIN = solve(MINX, MINY);        printf("Case %d: (%d,%d) %d\n", cnt, MINX, MINY, MIN);    }    return 0;}int QuickMod(int  a,int b,int n){    int r = 1;    while(b)    {        if(b&1)            r = (r*a)%n;        a = (a*a)%n;        b >>= 1;    }    return r;}void getPrime(){    memset(prime, 0, sizeof(prime));    prime[0] = 1;    prime[1] = 1;    for(int i = 2; i < N; ++i)    {        if(prime[i] == 0)        {            for(int j = i+i; j < N; j+=i)                prime[j] = 1;        }    }}void bash(int n, int m){    if(n%(m+1) != 0)        printf("1\n");    else        printf("0\n");}void wzf(int n, int m){    if(n > m)        swap(n, m);    int k = m-n;    int a = (k * (1.0 + sqrt(5.0))/2.0);    if(a == n)        printf("0\n");    else        printf("1\n");}int numsg[N];void SG(int n){    int sum = 0;    for(int i=0; i < n; i++)    {        scanf("%d",&numsg[i]);        sum ^= numsg[i];    }    if(sum == 0)        printf("No\n");    else    {        printf("Yes\n");        for(int i = 0; i < n; i++)        {            int s = sum ^ numsg[i];            if(s < numsg[i])                printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子        }    }}


D.  I've Got Your Back(gammon)

 

这道题目本来就是想直接很暴力很暴力写的,一直顾及会超时,又因为一开始写的时候写的不顺利 ,比赛的时候就

木有弄出来。第二天,重新写了一下暴力的写法,A了,晕了;就是对于能够组成15的六个数字进行暴力枚举,因

为总的数量只有15503,每次查找的时候也是很快的,所以就直接暴力了(还是要试试):

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int gcd(int n,int m){    if(n<m) swap(n,m);    return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){    if(n<m) swap(n,m);    return n/gcd(n,m)*m;}#define N 20000int prime[N];struct node{    int data[6];} num[N];void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);char order[10];void init(){    int index = 0;    for(int i1 = 0; i1 <= 15; ++i1)    {        for(int i2 = 0; i2 <= 15; ++i2)        {            for(int i3 = 0; i3 <= 15; ++i3)            {                for(int i4 = 0; i4 <= 15; ++i4)                {                    for(int i5 = 0; i5 <= 15; ++i5)                    {                        for(int i6 = 0; i6 <= 15; ++i6)                        {                            if(i1+i2+i3+i4+i5+i6 == 15)                            {                                num[index].data[0] = i1;                                num[index].data[1] = i2;                                num[index].data[2] = i3;                                num[index].data[3] = i4;                                num[index].data[4] = i5;                                num[index].data[5] = i6;                                index++;                            }                        }                    }                }            }        }    }}int main(){    init();    int cnt = 0;    while(scanf("%s", order))    {        int i1, i2, i3, i4, i5, i6;        int ii;        if(order[0] == 'e')            break;        cnt++;        if(order[0] == 'm')        {            scanf("%d%d%d%d%d%d", &i1,&i2,&i3,&i4,&i5,&i6);            for(int index = 0;  index <= 15504; ++index)            {                if(num[index].data[0] == i1&&num[index].data[1] == i2&&num[index].data[2] == i3&&                        num[index].data[3] == i4&&num[index].data[4] == i5&&num[index].data[5] == i6)                {                    printf("Case %d: %d\n", cnt, index);                    break;                }            }        }        else if(order[0] == 'u')        {            printf("Case %d: ", cnt);            scanf("%d", &ii);            for(int i = 0; i < 5; ++i)            {                printf("%d ", num[ii].data[i]);            }            printf("%d\n", num[ii].data[5]);        }    }    return 0;}int QuickMod(int  a,int b,int n){    int r = 1;    while(b)    {        if(b&1)            r = (r*a)%n;        a = (a*a)%n;        b >>= 1;    }    return r;}void getPrime(){    memset(prime, 0, sizeof(prime));    prime[0] = 1;    prime[1] = 1;    for(int i = 2; i < N; ++i)    {        if(prime[i] == 0)        {            for(int j = i+i; j < N; j+=i)                prime[j] = 1;        }    }}void bash(int n, int m){    if(n%(m+1) != 0)        printf("1\n");    else        printf("0\n");}void wzf(int n, int m){    if(n > m)        swap(n, m);    int k = m-n;    int a = (k * (1.0 + sqrt(5.0))/2.0);    if(a == n)        printf("0\n");    else        printf("1\n");}int numsg[N];void SG(int n){    int sum = 0;    for(int i=0; i < n; i++)    {        scanf("%d",&numsg[i]);        sum ^= numsg[i];    }    if(sum == 0)        printf("No\n");    else    {        printf("Yes\n");        for(int i = 0; i < n; i++)        {            int s = sum ^ numsg[i];            if(s < numsg[i])                printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子        }    }}


 

 

原创粉丝点击