拼多多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))