20190908 iQiyi、BIGO、ByteDance

IQIYI

1.1。

Leetcodeの元のタイトル

#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;
#define mod 1000000007
int n;
int dp[1001][1001];
bool flag[1001];
int main(){
    scanf("%d",&n);
    int s;
    for(int i=0;i<n-1;i++){
        scanf("%d",&s);
        if(s){
            flag[i]=true;
        }
        else
        flag[i]=false;
    }
    for(int j=0;j<n;j++){
        dp[0][j]=1;
    }
    for(int i=0;i<n-1;i++){
        if(flag[i]){
            for(int j=0,cur=0;j<n-i-1;j++){
                dp[i+1][j]=cur=(cur+dp[i][j])%mod;
            }
        }
        else{
            for(int j=n-i-2,cur=0;j>=0;j--){
                dp[i+1][j]=cur=(cur+dp[i][j+1])%mod;
            }
        }
    }
    /*for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            printf("%d ",dp[i][j]);
        }
        printf("\n");
    }*/
    printf("%d\n",dp[n-1][0]);
    //system("PAUSE");
    return 0;
}


2.2。

ABCからn個の赤いボール、m個の青いボール、3人がいます。Aから始めてボールを取得します。ABは赤いボールを取得します。ゲームは終了します。Cは混乱しています。赤いボールと青いボールを取得できますが、彼が赤いボールを取得した場合はカウントされません。彼がすべての赤いボールを取った場合、勝ちます。Bの勝ちを数え、Aが勝つ確率を計算します。

タイムアウトしました。

#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 n,m;
double dfs(int abc,int r,int b){
    if(r<=0)
    return 0.0;
    if(abc==0){
        if(b==0)
        return (double)r/(r+b);
        return (double)r/(r+b)+(double)b/(r+b)*dfs(1,r,b-1);
    }
    else{
        if(abc==1){
            if(b==0)
            return 0.0;
            return (double)b/(r+b)*dfs(2,r,b-1);
        }
        else{
            if(b==0)
            return (double)r/(r+b)*dfs(0,r-1,b);
            return (double)r/(r+b)*dfs(0,r-1,b)+(double)b/(r+b)*dfs(0,r,b-1);
        }
    }
}
int main(){
    scanf("%d %d",&n,&m);
    //int sum=n+m;
    double ans=1.0;
    ans=dfs(0,n,m);
    printf("%.5lf\n",ans);
    //system("PAUSE");
    return 0;
}

 アレイの一時ストレージの最適化を使用する必要がある場合があります

#include <iostream>
#include <vector>
#include <set>
#include <queue>
#include <map>
#include <string.h>
#include <math.h>
#include <stack>
using namespace std;
double f[1005][1005][3];
double dfs(int x, int y, int t) {
    if (f[x][y][t] != -1) return f[x][y][t];
    double ans = 0;
    if (x > 0) {
        if (t == 0) ans += (double)x / (double)(x+y);
        if (t == 2) {
            ans += (double)x / (double)(x+y) * dfs(x-1, y, (t+1)%3);
        }
    }

    if (y > 0) {
        ans += (double)y / (double)(x+y) * dfs(x, y-1, (t+1)%3);
    }
    //f[x][y][t] = ans;
    //printf("OOOO %d %d %d %f\n", x, y, t, f[x][y][t]);
    return f[x][y][t] = ans;
}

void work() {

    int n, m;
    scanf("%d%d", &n, &m);
    memset(f, 0, sizeof f);
    for (int i = 0; i <= n+1; i++)
        for (int j = 0; j <= m+1; j++)
            for (int k = 0; k < 3; k++)
                f[i][j][k] = -1;
    double ans = 0;
    ans = dfs(n, m, 0);
    printf("%.5f\n", ans);
}

int main() {
    work();
    return 0;
}

BIGO

1.1。

石の問題を取る(ゲーム理論)

2.2。

align_malloc

3.3。

階段を上る、一度に1、2、3歩登ることができ、方法の総数を見つけることができます

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
using namespace std;
int n;
int dfs(int left){
    if(left==0)return 1;
    if(left<0) return 0;
    return dfs(left-1)+dfs(left-2)+dfs(left-3);
}
int climb_base(int n){
    int ans=dfs(n);
    return ans;
}
int main(){
    scanf("%d",&n);
    int ans;
    ans=climb_base(n);
    cout<<ans<<endl;
    //system("PAUSE");
    return 0;
}

4.4。

2つのばらばらの連続サブアレイの最大合計を求めます

見出し

1.1。

n = int(input().strip())
a = list(map(int, input().strip().split()))

res = [-1, 0]
i = n-1
stack = [[a[i], i]]
i -= 1
while stack and i >= 0:
	ans = 0
	while stack and a[i] >= stack[-1][0]:
		stack.pop(-1)
		ans += 1
	if ans >= res[1]:
		res = [a[i], ans]
	stack.append([a[i], i])
	i -= 1
print(res[0])

 2.水を注ぐ

 


import java.util.*;

public class Main {
    public static class Water{
        public int l1=0;
        public int l2=0;
        public int l3=0;
        public Water(Water w){
            l1=w.l1;l2=w.l2;l3=w.l3;
        }
        public Water(){
            l1=0;l2=0;l3=0;
        }
        @Override
        public int hashCode(){
            String str=String.valueOf(l1)+String.valueOf(l2)+String.valueOf(l3);
            return  Integer.valueOf(str);
        }
        @Override
        public boolean equals(Object  obj){
            if(obj instanceof Water) {
                Water w = (Water) obj;
                return (w.l1 == l1 && w.l2 == l2 && w.l3 == l3);
            }
            return  false;
        }
    }
    public static void bfs(int kettle[],Water water,HashSet<Water> set,List<Water> queue){

        Water w=new Water(water);
        w.l1=kettle[0];
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }
        w=new Water(water);
        w.l2=kettle[1];
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }
        w=new Water(water);
        w.l3=kettle[2];
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }
        w=new Water(water);
        w.l1=0;
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }
        w=new Water(water);
        w.l2=0;
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }
        w=new Water(water);
        w.l3=0;
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }
        w=new Water(water);
        w.l1=(water.l1+water.l2-kettle[1])<0?0:(water.l1+water.l2-kettle[1]);
        w.l2=(water.l1+water.l2>kettle[1])?kettle[1]:(water.l1+water.l2);
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }

        w=new Water(water);
        w.l2=(water.l1+water.l2-kettle[0])<0?0:(water.l1+water.l2-kettle[0]);
        w.l1=(water.l1+water.l2>kettle[0])?kettle[0]:(water.l1+water.l2);
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }

        w=new Water(water);
        w.l1=(water.l1+water.l3-kettle[2])<0?0:(water.l1+water.l3-kettle[2]);
        w.l3=(water.l1+water.l3>kettle[2])?kettle[2]:(water.l1+water.l3);
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }

        w=new Water(water);
        w.l3=(water.l1+water.l3-kettle[0])<0?0:(water.l1+water.l3-kettle[0]);
        w.l1=(water.l1+water.l3>kettle[0])?kettle[0]:(water.l1+water.l3);
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }

        w=new Water(water);
        w.l2=(water.l2+water.l3-kettle[2])<0?0:(water.l2+water.l3-kettle[2]);
        w.l3=(water.l2+water.l3>kettle[2])?kettle[2]:(water.l2+water.l3);
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }

        w=new Water(water);
        w.l3=(water.l2+water.l3-kettle[1])<0?0:(water.l2+water.l3-kettle[1]);
        w.l2=(water.l2+water.l3>kettle[1])?kettle[1]:(water.l2+water.l3);
        if(!set.contains(w)){
            set.add(w);
            queue.add(w);
        }
    }
    public static int func(int kettle[],int target){
        Water water=new Water();
        HashSet<Water> set=new HashSet<>();
        List<Water> queue=new ArrayList<>();
        queue.add(water);
        set.add(water);
        int deep=0;
        while(!queue.isEmpty()){
            int size=queue.size();
            for(int i=0;i<size;i++){
                Water tmp=queue.remove(0);
                if(tmp.l1==target||tmp.l2==target||tmp.l3==target){
                    return deep;
                }
                bfs(kettle, tmp,set,queue);
                int a=1;
            }

            deep++;
        }
        return -1;
    }
    public static void main(String[] args) {
	// write your code here
        Scanner sc=new Scanner(System.in);
        int kettle[]=new int[3];
        kettle[0]=sc.nextInt();
        kettle[1]=sc.nextInt();
        kettle[2]=sc.nextInt();
        int target=sc.nextInt();
        int res=func(kettle,target);
        System.out.println(res);
        //3 5 8 4
    }
}

3.3。

 

 

 

4.4。

 

ch='0ABCDEFGHIJKLMNOPQRSTUVWXYZ'
s = str(input().strip())
n = len(s)
res=''
def dfs(i,l,res):
	if i==l :
		print(res)
	if l-i>=1:
		a=int(s[i])
		if a==0:
			return
		dfs(i+1,l,res+ch[a])
	if l-i >= 2 :
		a=int(s[i:i+2])
		if a<10 or a>=27:
			return
		dfs(i+2,l,res+ch[a])

dfs(0,n,res)

 

おすすめ

転載: blog.csdn.net/LXQ1071717521/article/details/100633742