20190907友塔游戏,网易互娱,20190905HULU

友塔游戏

1.

样例的输出是

2.8284271

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
using namespace std;
int n;
int main(){
    scanf("%d",&n);
    double r,pi,ang;
    ang=360.0/n;
    ang=(180-ang)/2;
    r=0.5/cos(ang/180*3.1415926);
    //cout<<ang<<" "<<r<<endl;
    pi=n/2/r;
    cout.precision(8);
    cout<<pi<<endl;
    //system("PAUSE");
    return 0;
}

2.

3.

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
#include<cmath>
#include<climits>
#include<queue>
#include<cstring>
using namespace std;
int m,n;
int mig[201][201];
bool flag[201][201];
struct node {
    int x,y,z;
    node(int _x, int _y, int _z) : x(_x), y(_y), z(_z) {}
};
struct cmp{
    bool operator()(const node a,const node b)const{
        return a.z>b.z;
    }
};
int main(){
    int s;
	scanf("%d %d",&m,&n);
    for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			scanf("%d",&mig[i][j]);
		}
    }
    int dirx[] = {-1, 1, 0, 0};
    int diry[] = {0, 0, -1, 1};
    priority_queue<node,vector<node>,cmp> pq;
    memset(flag,false,sizeof(flag));
    pq.push(node(0,0,0));
    node cur(0,0,0);
    int ans,x,y;
    while(!pq.empty()){
        cur=pq.top();
        pq.pop();
        if(cur.x==m-1&&cur.y==n-1){
            ans=cur.z;
            break;
        }
        if (flag[cur.x][cur.y])
            continue;
        flag[cur.x][cur.y] = true;
        for (int j = 0; j < 4; j++) {
            x = cur.x + dirx[j];
            y = cur.y + diry[j];
            if (x < 0 || x >= m || y < 0 || y >= n)
                continue;
            if (flag[x][y])
                continue;
            if (mig[x][y] != 0)
                pq.push(node(x, y, cur.z+mig[x][y]));
            else
                continue;
        }
    }
	printf("%d\n",ans);
	//system("PAUSE");
	return 0;
}

4.

HULU

1.

n个人围成一圈报数,从1开始,报到m的人淘汰,下一个人从1开始继续报数。。。

a[i]=1表示是好人,a[i]=0表示是坏人

w[i]表示每个人被选为起点的权重

求最后剩好人的概率,保留小数点后5位

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
using namespace std;
int n,m;
vector<int> a;
vector<int> w;
int main(){
    int s;
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++){
		cin>>s;
		a.push_back(s);
	}
    double sum=0;
    for(int i=0;i<n;i++){
		cin>>s;
		w.push_back(s);
        sum=sum+s;
	}
	double ans=0;
    int f=0;
    for(int i=2;i<n+1;i++){
        f = (f+m) % i;
    }
    for(int i=0;i<n;i++){
        ans += w[i] * a[(i+f)%n];
    }
    ans=ans/sum;
    printf("%.5lf\n",ans);	
	//system("PAUSE");
	return 0;
}

2.

数组中所有子集中最大值的和

n = int(input().strip())
arr = list(map(int, input().strip().split()))
mod = 10**9+7

def he(n):
	return n*(n+1)//2

def solve(arr):
	global mod
	n = len(arr)
	if n == 0:
		return 0
	if n == 1:
		return arr[0]
	max_value = max(arr)
	max_value_i = arr.index(max_value)
	total = he(n)
	left, right = he(max_value_i), he(n-1-max_value_i)
	total = (total - left - right) % mod
	contribution = (total * max_value) % mod
	return (solve(arr[:max_value_i]) + fun(solve[max_value_i+1:]) + contribution) % mod

print(solve(arr))

3.

广度优先遍历求解迷宫问题

#define MAXN 5000
bool a[MAXN][MAXN];
bool vis[MAXN][MAXN];
struct node {
    int x,y,z;
    node(int _x, int _y, int _z) : x(_x), y(_y), z(_z) {}
};
int main() {
    int n, tmp;

    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &tmp);
            if (tmp)
                a[i][j] = true;
            else
                a[i][j] = false;
        }
    }
    int dirx[] = {-1, 1, 0, 0};
    int diry[] = {0, 0, -1, 1};
    memset(vis, false, sizeof(vis));
    deque<node> dq;
    node cur(0, 0, 0);
    dq.push_back(node(0, 0, 0));
    int x, y;
    int ans;
    while (!dq.empty()) {
        cur = dq.front();
        dq.pop_front();
        if (cur.x == n - 1 && cur.y == n - 1) {
            ans = cur.z;
            break;
        }
        if (vis[cur.x][cur.y])
            continue;
        vis[cur.x][cur.y] = true;

        for (int j = 0; j < 4; j++) {
            x = cur.x + dirx[j];
            y = cur.y + diry[j];
            if (x < 0 || x >= n || y < 0 || y >= n)
                continue;
            if (vis[x][y])
                continue;

            if (a[x][y] == false)
                dq.push_front(node(x, y, cur.z));
            else
                dq.push_back(node(x, y, cur.z + 1));
        }
    }
    printf("%d\n", ans);
}

网易互娱

1.

判断一个十进制数的二进制是不是回文的

t个用例


#include <stdio.h>
#include <math.h>
int main()
{
    int b,i,j,c,m;
    double sum;
    int a[20];
    int t;
    scanf("%d",&t);
    while(t--){
        while(scanf("%d",&b)!=EOF){
            m=b;
            c=0;
            sum=0;
            while(b!=0){
                i=b%2;
                a[c]=i;
                c++;
                b=b/2;
            }
            c--;
            for(j=0;j<=c;j++){
                sum=sum+a[j]*pow(2,c-j);
            }
            if(sum-m==0)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
    return 0;
}

2.

 一个二叉树的每一层的节点的权值和都严格小于下一层的节点权值和,称为递增树

判断t个二叉树是否为递增树

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
#include<cmath>
#include<climits>
#include<queue>
#include<cstring>
using namespace std;
int t;
int m,n;
int node[1000][3];
int father[1000];
int res[500];
int deep(int i,int d){
    res[d]+=node[i][0];
    int l=0,r=0;
    if(node[i][1]!=-1)
    l=deep(node[i][1],d+1);
    if(node[i][2]!=-1)
    r=deep(node[i][2],d+1);
    if(node[i][1]==-1&&node[i][2]==-1)
    return d;
    return max(l,r);
}
int main(){
	scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int root;
        for(int i=0;i<n;i++)
        father[i]=i;
        for(int i=0;i<n;i++){
            scanf("%d %d %d",&node[i][0],&node[i][1],&node[i][2]);
            if(node[i][1]!=-1)
            father[node[i][1]]=i;
            if(node[i][2]!=-1)
            father[node[i][2]]=i;
        }
        for(int i=0;i<n;i++){
            if(father[i]==i){
                root=i;
                break;
            }
        }
        memset(res,0,sizeof(res));
        int ans=deep(root,0);
        bool flag=true;
        for(int i=0;i<ans;i++){
            if(res[i]>=res[i+1]){
                flag=false;
                break;
            }
        }
        if(flag)
        printf("YES\n");
        else
        printf("NO\n");
    }
	//system("PAUSE");
	return 0;
}

3.

小明喜欢喝咖啡,一个月1到30号,总有那么几天喝咖啡,但是他要控制自己,所以给自己设置喝咖啡的间隔天数k,另外,一个月还有m天举行比赛,他都会喝咖啡庆祝,这m天的间隔都大于k,求每个月他最多有几天喝咖啡。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
#include<cmath>
#include<climits>
#include<queue>
#include<cstring>
using namespace std;
int t;
int k,m;
int shu[31];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d %d",&k,&m);
        for(int i=0;i<m;i++){
            scanf("%d",&shu[i]);
        }
        if(k==0){
            printf("30\n");
            continue;
        }
        if(m==0){
            printf("%d\n",30/(k+1));
            continue;
        }
        int pre=0;
        int ans=m;
        sort(shu,shu+m);
        for(int i=0;i<m;i++){
            if(i==0){
                ans=ans+(shu[i]-pre-1)/(k+1);
            }
            else{
                if(shu[i]-pre>(k+1))
                ans=ans+(shu[i]-pre-1-k)/(k+1);
            }
            pre=shu[i];
            cout<<shu[i]<<" "<<ans<<" "<<((shu[i]-pre-1)/(k+1))<<endl;
        }
        if(m>0){
            if(30-pre>=(k+1))
            ans=ans+(30-pre)/(k+1);
        }
        printf("%d\n",ans);
    }
    //system("PAUSE");
    return 0;
}

4.

猜你喜欢

转载自blog.csdn.net/LXQ1071717521/article/details/100601800