ICPC North Central NA Contest 2017

 H. Zebras and Ocelots

思路

这题的代码有省略,我们每次取出最低位置的1,然后这个数后面都是0,要想翻转后面的数和这个数,只需要减一即可。

所以

while (x) {
    // long long y=x&(-x);
    x--;
}

代码

#include <bits/stdc++.h>
using namespace std;

const int maxn=1e6+10;
long long n;

int main()
{
    string str;
    cin>>n;
    long long x=0;
    for (long long i=n-1;i>=0;i--) {
        cin>>str;
        if (str[0]=='O') {
            x|=(1LL<<i);
        }
    }
    cout<<x<<endl;
    return 0;
}

 I. Racing Around the Alphabet

思路

这题主要是精度,pi要用acos函数求。

代码

#include <bits/stdc++.h>
using namespace std;

const int maxn=505;
const int CH_NUM=28;
const double PI=acos(-1);
const int r=30;
string str;
int dis[CH_NUM+2][CH_NUM+2];
/*
r=30
c=2*PI*r
*/

inline int trans(char ch) {
    if (ch==' ') {
        return 26;
    }
    if ((ch>='A'&&ch<='Z')) {
        return ch-'A';
    }
    return 27;
}
int main()
{
    for (int i=0;i<CH_NUM;i++) {
        for (int j=i+1;j<CH_NUM;j++) {
            int left=CH_NUM-j+i;
            int right=j-i;
            dis[i][j]=left<right?left:right;
            dis[j][i]=dis[i][j];
            // printf("%d  ",dis[i][j]);
        }
        // printf("\n");
    }
    int n;
    cin>>n;
    cin.get();
    while (n--) {
        getline(cin,str);
        int len=str.length();
        int cnt=0;
        for (int i=0;i<len-1;i++) {
            int x=trans(str[i]);
            int y=trans(str[i+1]);
            cnt+=dis[x][y];
            // printf("%d %d %d\n",x,y,dis[x][y]);
        }
        // printf("%d\n",cnt);
        double C=2*PI*r;        
        // printf("%.10f %.10f\n",C,cnt/28.0);
        double ans=(cnt/28.0)*C/15.0+len;
        printf("%.10f\n",ans);
    }
    return 0;
}

G. Sheba's Amoebas

思路

并查集直接找,但是每一个值为真的点都要找8个方向判断并连结,不然会发现在有些情况下是错的。

直接枚举就可以了。

代码

#include <bits/stdc++.h>
using namespace std;

const int maxn=105;
int m,n;
int d[8][2]={1,0,-1,0,0,1,0,-1,1,1,-1,-1,-1,1,1,-1};
int g[maxn][maxn],pre[maxn*maxn];

void init() {
    for (int i=0;i<n*m;i++) {
        pre[i]=i;
    }
}

int trans(int i,int j) {
    return i*m+j;
}

bool check(int x,int y) {
    if (x>=0&&y>=0&&x<n&&y<m) {
        return true;
    }
    return false;
}

inline int find(int x) {
    if (pre[x]==x) {
        return x;
    }
    return pre[x]=find(pre[x]);
}

void unions(int x,int y) {
    int fx=find(x);
    int fy=find(y);
    if (fx!=fy) {
        pre[fx]=fy;
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    init();
    char str[maxn];
    for (int i=0;i<n;i++) {
        scanf("%s",str);
        for (int j=0;str[j];j++) {
            g[i][j]=(str[j]=='#'?1:0);
        }
    }
    for (int i=0;i<n;i++) {
        for (int j=0;j<m;j++) {
            if (g[i][j]) {
                for (int k=0;k<8;k++) {
                    int dx=i+d[k][0];
                    int dy=j+d[k][1];
                    if (check(dx,dy)&&g[dx][dy]) {
                        unions(trans(i,j),trans(dx,dy));
                    }
                }
            }
        }
    }
    int ans=0;
    for (int i=0;i<n;i++) {
        for (int j=0;j<m;j++) {
            if (g[i][j]&&find(trans(i,j))==trans(i,j)) {
                ans++;
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xyqxyq/p/12383858.html