20190901拼多多,腾讯笔试日记

拼多多20190901

1.

有一堆整数,偶数的优先级比奇数的优先级大,同为奇数或者偶数,数值大的优先级大,要求对其排序,输出优先级最高的前n个数。

输入只有一行,s1,s2,s3...,sk;n。

输出优先级最高的前n个数。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
using namespace std;
vector<int> shu;
bool cmp(int a,int b){
	if(a%2==0&&b%2==1)
	return true;
	if(b%2==0&&a%2==1)
	return false;
	return a>b;
}
int main(){
	int n;
	int s;
	char c;
	scanf("%d",&s);
	shu.push_back(s);
	while(scanf("%c",&c)&&c!=';'){
		scanf("%d",&s);
		shu.push_back(s);
	}
	scanf("%d",&n);
	sort(shu.begin(),shu.end(),cmp);
	for(int i=0;i<n;i++){
		printf("%d",shu[i]);
		if(i!=n-1)
		printf(",");
	}
	printf("\n");
	//system("PAUSE");
	return 0;
}

2.

 

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
using namespace std;
void solve(vector<string>& ans,string str1,string str2,string ne,string a){
	if(str1.size()==0){
		if(!ne.compare(str2))
		ans.push_back(a);
		return;
	}
	//cout<<str1<<" "<<str2<<" "<<ne<<" "<<a<<endl;
	string s=str1;
	solve(ans,s.erase(0,1),str2,ne,a+'d');
	char c=str1[0];
	s=str1;
	solve(ans,s.erase(0,1),str2,c+ne,a+'l');
	s=str1;
	solve(ans,s.erase(0,1),str2,ne+c,a+'r');
}
int main(){
	int n;
	scanf("%d",&n);
	string str1,str2;
	for(int k=0;k<n;k++){
		cin>>str1>>str2;
		vector<string> ans;
		string ne;
		string a;
		solve(ans,str1,str2,ne,a);
		//sort(ans.begin(),ans.end());
		printf("{\n");
		for(int i=0;i<ans.size();i++){
			for(int j=0;j<ans[i].size();j++){
				printf("%c ",ans[i][j]);
				if(j==ans[i].size()-1)				
				printf("\n");			
			}
		}
		printf("}\n");
	}
	//system("PAUSE");
	return 0;
}

3.

有n个骰子,每个骰子的可得到的结果数量是xi,即可得到[1,xi]这几个数字。

给出n,

x1,x2,x3,...,xn

求投掷这n个骰子所得到的最大值的期望

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
using namespace std;
vector<int> shu;
int main(){
	int n;
	int s,maxs=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		cin>>s;
		shu.push_back(s);
		if(s>maxs)
		maxs=s;
	}
	double ans=0;
	double now=0,pre=0;
	for(int i=1;i<=maxs;i++){
		now=1.0;
		for(int j=0;j<n;j++){
			if(shu[j]>=i)
			now=now*i/shu[j];
			else
			now=now*1;		
		}
		cout<<now<<endl;
		ans += (now - pre)*i; //乘以对应的i ,求期望
		pre = now;
	}
	printf("%.2lf\n",ans);
	//system("PAUSE");
	return 0;
}

4.

 

腾讯20190901

1.

t个测试用例。

每个用例有n个数,n为偶数,每次从n个数中选2个不相同的数删掉,最后能不能将n个数完全删掉。

输出YES或者NO。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
#include<map>
using namespace std;
int t;
int main(){
	int n;
	int s;
	scanf("%d",&t);
    while(t--){
        cin>>n;
        map<int,int> ma;
        for(int i=0;i<n;i++){
            cin>>s;
            if(ma.count(s)==0){
                ma[s]=1;
            }
            else
                ma[s]++;
        }
        int maxi=0;
        for(map<int,int>::iterator it1=ma.begin();it1!=ma.end();it1++){
            if(it1->second>maxi)
            maxi=it1->second;
        }
        if(maxi>n/2)
        cout<<"NO"<<endl;
        else
        cout<<"YES"<<endl;
    }
	//system("PAUSE");
	return 0;
}

2.

种一排花,红花无限制,连续的白花必须是k的倍数(包括0),

t是测试用例数,k的意义如上,

每个用例给定[s,e],花的总长度s到e,给出所有的情况数量。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
using namespace std;
#define mod 1000000007
int t,k;
long long res[3][100005];
long long solve(int state,int len){
	if(res[state][len]!=0)
	return res[state][len];
	if(len<0)
	return 0;
	if(len==0){
		res[state][len]=1;
		return res[state][len];
	}
	res[state][len]= solve(1,len-1)+solve(2,len-k);
	return res[state][len];
}
int main(){
	long long ans;
	int s,e;
	cin>>t>>k;
	for(int i=0;i<t;i++){
		ans=0;
		cin>>s>>e;
		for(int j=s;j<=e;j++){
			ans=ans+solve(0,j);
		}
		cout<<ans%mod<<endl;
	}
	//system("PAUSE");
	return 0;
}

3.

输入,n,p,q,

n个硬币,至少p个正面向上,至少q个反面向上,求正面向上硬币数量的数学期望

比如:输入2 1 0

复杂度有点高,不知道如何优化,,,

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
using namespace std;
#define mod 100000007
int n,p,q;
long long solve(int n,int m){
	long long ans = 1;
	if(m < n-m) 
	m = n-m;
	for(int i = m+1; i <= n; i++) ans *= i;
	for(int j = 1; j <= n - m; j++) ans /= j;
	return ans;
}
int main(){
	long long ans1=0,ans2=0,temp,ans;
	cin>>n>>p>>q;
	for(int i=p;i<=n-q;i++){
		temp=solve(n,i);
		ans2=ans2+temp;
		ans1=ans1+temp*i;
	}
	ans1=ans1%mod;
	ans2=ans2%mod;
	//cout<<ans1<<" "<<ans2<<endl;
	if(ans1%ans2==0)
	cout<<ans1/ans2<<endl;
	else{
		while((ans1+mod)%ans2!=0){
			ans1=ans1+mod;
		}
		ans=(ans1+mod)/ans2;
		cout<<ans<<endl;
	}
	system("PAUSE");
	return 0;
}

4.

一个字符串是由一个子串不断重复而成,

输入

n

str

str就是这个字符串的前n个字符

下面是t个测试用例

每个用例是字符串

判断这个字符串能否生成str

超时了,待优化。。。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
#include<string>
using namespace std;
vector<int> shu;
int n;
int main(){
	cin>>n;
	string str;
	cin>>str;
	int t;
	cin>>t;
	int ans=0;
	while(t--){
		string s;
		cin>>s;
		string s1=s;
		int l=s1.size();
		if(!str.compare(s1.substr(0,l))){
			while(l<n){
				s1=s1+s;
				l+=l;
			}
		}
		else
		{
			break;
		}
		if(!str.compare(s1.substr(0,n)))
		ans++;
		//cout<<ans<<" "<<s1.substr(0,n)<<endl;
	}
	cout<<ans<<endl;
	//system("PAUSE");
	return 0;
}

算式排序

from copy import copy

n = int(input())
s = input()
tmp = s.split()

def my_eval(l):
 s = ''.join(l)
 return eval(s)

for i in range(n):
 for j in range(n-1):
  t = copy(tmp)
  if int(tmp[2*j]) > int(tmp[2*j+2]):
   t[2*j], t[2*j+2] = t[2*j+2], t[2*j]
   if my_eval(t) == my_eval(tmp):
    tmp = t

print(' '.join(tmp))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值