A
思路:
直接DFS将能走的全部砖块染色即可。
代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define INF 0x3f3f3f3f3f
using namespace std;
int dx[10]= {-1,1,0,0};
int dy[10]= {0,0,-1,1};
const int maxn=100+10;
int w,h;
char a[maxn][maxn];
bool vis[maxn][maxn];
int maxx;
int ty[maxn][maxn];
void dfs(int x,int y,int step)
{
//cout<<x<<"---"<<y<<endl;
for(int i=0; i<4; i++)
{
if(x+dx[i]<=0||y+dy[i]<=0||x+dx[i]>h||y+dy[i]>w)
continue;
if(vis[x+dx[i]][y+dy[i]])
continue;
if(a[x+dx[i]][y+dy[i]]=='#')
continue;
vis[x+dx[i]][y+dy[i]]=1;
dfs(x+dx[i],y+dy[i],step+1);
}
return ;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
while(cin>>w>>h&&w&&h)
{
memset(vis,0,sizeof(vis));
maxx=0;
int x1,y1;
rep(i,1,h)
{
rep(j,1,w)
{
cin>>a[i][j];
if(a[i][j]=='@')
{
x1=i;
y1=j;
}
}
}
vis[x1][y1]=1;
dfs(x1,y1,0);
rep(i,1,h)
{
rep(j,1,w)
{
if(vis[i][j])
maxx+=1;
}
}
cout<<(maxx)<<endl;
}
}
/**************************************************************
Problem: 1110
User: 20171789
Language: C++
Result: 正确
Time:0 ms
Memory:1780 kb
****************************************************************/
B
思路:
求乘积最长路即可。
代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define INF 0x3f3f3f3f3f
using namespace std;
int dx[10]= {-1,1,0,0};
int dy[10]= {0,0,-1,1};
const int maxn=3000+10;
int n,m;
struct node
{
int to;
double cost;
};
int bx,by;
vector<node>v[maxn];
bool vis[maxn];
double dis[maxn];
priority_queue<pair<int,double>,vector<pair<int,double>>,less<pair<int,double>> >q;
void solve()
{
rep(i,0,n+1)dis[i]=0,vis[i]=0;
while(q.size())
q.pop();
dis[bx]=1.0;
q.push(make_pair(bx,1.0));
while(q.size())
{
int now=q.top().first;
q.pop();
// if(vis[now])
// continue;
// vis[now]=1;
for(int i=0; i<(int)v[now].size(); i++)
{
int to=v[now][i].to;
double co=v[now][i].cost;
if(dis[to]<dis[now]*co)
{
dis[to]=dis[now]*co;
//cout<<dis[to]<<"--"<<endl;
q.push(make_pair(to,dis[to]));
}
}
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
while(cin>>n>>m)
{
rep(i,1,m)
{
int a,b,c;
cin>>a>>b>>c;
double c1=1-c*1.0/100;
//cout<<c1<<endl;
v[a].push_back(node{b,c1});
v[b].push_back(node{a,c1});
}
cin>>bx>>by;
solve();
//cout<<dis[by]<<endl;
printf("%.8lf\n",100.0/dis[by]);
rep(i,1,n)
{
if(v[i].size())
v[i].clear();
}
}
}
/**************************************************************
Problem: 1111
User: 20171789
Language: C++
Result: 正确
Time:48 ms
Memory:2720 kb
****************************************************************/
C
思路:
马拉车算法
代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define INF 0x3f3f3f3f3f
using namespace std;
int dx[10]= {-1,1,0,0};
int dy[10]= {0,0,-1,1};
const int maxn=20000+10;
char ch[maxn];
char now[maxn<<1];
int n;
int hw[maxn<<1];
void init()
{
now[0]='!',now[1]='#';
for(int i=0; i<n; i++)
{
now[2*i+2]=ch[i];
now[2*i+3]='#';
}
now[2*n+2]='$';
n=2*n+1;
}
void manacher()
{
int maxright,mid;
maxright=0;
for(int i=1; i<=n; i++)
{
//cout<<i<<endl;
if(i>maxright)
{
hw[i]=1;
}
else
{
hw[i]=min(hw[mid*2-i],maxright-i);
}
while(now[i-hw[i]]==now[i+hw[i]])
hw[i]++;
if(maxright<i+hw[i])
{
mid=i;
maxright=i+hw[i];
}
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
while(cin>>ch)
{
int ans=0;
memset(hw,0,sizeof(hw));
n=strlen(ch);
init();
manacher();
for(int i=0; i<=n; i++)
{
ans+=hw[i]/2;
}
cout<<ans<<endl;
}
}
D
思路:
直接排序。
代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define INF 0x3f3f3f3f3f
using namespace std;
int dx[10]= {-1,1,0,0};
int dy[10]= {0,0,-1,1};
const int maxn=100+10;
int a[maxn],b[maxn];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int n,m;
while(cin>>n)
{
rep(i,1,n)cin>>a[i];
cin>>m;
rep(i,1,m)cin>>a[n+i];
sort(a+1,a+n+m+1);
rep(i,1,n+m)cout<<a[i]<<" ";
cout<<endl;
}
}
/**************************************************************
Problem: 1113
User: 20171789
Language: C++
Result: 正确
Time:0 ms
Memory:1712 kb
****************************************************************/
E
思路:
先将每一个十六进制数转化成4位的2进制,然后3个3个的转化成八进制即可。
代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define INF 0x3f3f3f3f3f
using namespace std;
int dx[10]= {-1,1,0,0};
int dy[10]= {0,0,-1,1};
const int maxn=400000+10;
char a[maxn];
int b[maxn];
int c[5];
int ans[maxn];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
while(cin>>a)
{
int flag=0;
int cnt=0;
int len=strlen(a);
rep(i,0,len-1)
{
char ch=a[i];
int tmpx=0;
if(ch>='A')
tmpx=ch-'A'+10;
else
tmpx=ch-'0';
int k=0;
memset(c,0,sizeof(c));
rep(j,1,4)
{
if(tmpx)
{
c[j]=tmpx%2;
tmpx/=2;
}
}
dep(j,4,1)
b[++cnt]=c[j];
}
//得到二进制序列
//rep(i,1,cnt)cout<<b[i];
//cout<<endl;
int ss=0;
for(int i=cnt; i>=1; i-=3)
{
int x=b[i]+b[i-1]*2+b[i-2]*4;
ans[++ss]=x;
}
int f=1;
rep(i,1,ss)
{
//cout<<ans[i]<<"--";
if(ans[i])
flag=1;
}
//cout<<flag<<endl;
if(!flag)
{
cout<<0<<endl;
continue;
}
while(!ans[ss])
ss--;
dep(i,ss,1)
{
cout<<ans[i];
}
cout<<endl;
}
}
/**************************************************************
Problem: 1114
User: 20171789
Language: C++
Result: 正确
Time:8 ms
Memory:5224 kb
****************************************************************/