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