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