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;
}