UVA1636 决斗 Headshot
#include <bits/stdc++.h>
using namespace std;
char s[110];
int shoot, no, len;
int main()
{
while(scanf("%s", &s)!=EOF){
shoot=0;
no=0;
len=strlen(s);
s[len]=s[0];
for(int i=0; i<len; ++i){
if(s[i]=='0'){
no++; //没有子弹的弹巢数
if(s[i+1]=='0'){
shoot++; //下一个弹巢也没子弹, 直接射击也没有子弹
}
}
}
//转一下, 没有子弹的概率为 no*no/len
//直接射击没有子弹的概率为shoot
if(no*no==len*shoot){
printf("EQUAL\n");
}
else if(no*no>len*shoot){
printf("ROTATE\n");
}
else{
printf("SHOOT\n");
}
}
return 0;
}
P4316 绿豆蛙的归宿
#include <bits/stdc++.h>
using namespace std;
int n, m, u, v;
double w, ans;
bool vis[100010];
struct node
{
int to;
double dis;
}asd;
vector<node> a[100010];
//从x出发, 当前走了curdis,总共经过点的分支乘积
void dfs(int x, double curdis, double p)
{
if(x==n){
ans+=curdis/p;
return;
}
vis[x]=true;
int num=a[x].size();
for(int i=0; i<num; ++i){
asd=a[x][i];
v=asd.to;
w=asd.dis;
if(!vis[v]){
dfs(v, curdis+w, p*num);
}
}
vis[x]=false;
}
int main()
{
//图的点数 n 和边数 m
scanf("%d %d", &n, &m);
for(int i=1; i<=m; ++i){
scanf("%d %d %lf", &u, &v, &w);
asd.to=v;
asd.dis=w;
a[u].push_back(asd);
}
dfs(1, 0, 1);
printf("%.2lf", ans);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, m, u, v;
double w, ans;
bool vis[100010];
struct node
{
int to;
double dis;
}asd;
vector<node> a[100010];
//从x出发, 当前走了curdis,当前概率
void dfs(int x, double curdis, double p)
{
if(x==n){
ans+=curdis*p;
return;
}
vis[x]=true;
int num=a[x].size();
for(int i=0; i<num; ++i){
asd=a[x][i];
v=asd.to;
w=asd.dis;
if(!vis[v]){
dfs(v, curdis+w, p/num);
}
}
vis[x]=false;
}
int main()
{
//图的点数 n 和边数 m
scanf("%d %d", &n, &m);
for(int i=1; i<=m; ++i){
scanf("%d %d %lf", &u, &v, &w);
asd.to=v;
asd.dis=w;
a[u].push_back(asd);
}
dfs(1, 0, 1);
printf("%.2lf", ans);
return 0;
}