题解:求Snuke可能赢的概率:
他只会抛一个面!!!!;
他总共有n个数,翻到第i个数的概率是1.0/n;
而每一个数会被翻到累加这个数的两倍>=k为止,
需要一个循环,条件就是d<k,d*=2;(d=i),而要保证为正面不为反面的概率是二分之一,所以翻到每一个数字的概率还要乘以0.5,一直乘,直到退出循环为止,此时加上每个数累乘的概率即为答案;
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int n;
int k;
cin>>n>>k;
double sum=0;
double d;
for(int i=1;i<=n;i++){
double p=1.0/n;
d=i;
while(d<k){
p*=0.5;
d*=2;
}
sum+=p;
}
printf("%0.12f",sum);
return 0;
}
求升序序列有多少个:
可以用deque,
lower_bound返回的是大于等于该元素的最小值
upper_bound返回的是大于该元素的最大值
依次输入Ai,在双端队列中找出大于等于x的数,用 a.lower_bound(),当它没找到时返回0,直接向前添加,如果找到了,需要替换a[it-1]的数值、最后输出deque里有多少个非升序序列;因为替换的是第一个大于等于x的数在小一个数,所以该序列依旧是有序的;
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
deque<int>a;
for(int i=1;i<=n;i++){
int x;
cin>>x;
auto it=lower_bound(a.begin(),a.end(),x)-a.begin();
if(!it){
a.push_front(x);
}
else {
a[--it]=x;
}
}
cout<<a.size()<<endl;
return 0;
}
还可以用动态数组:
将输入的数都乘以一个-1,让他的大小颠倒,
然后再在其中找到一个小于-X的最大数,也就是大于x的最小值,若存在,替换该升序数组中的最大值,也就是替换数组里的值,否则,就直接在加入一组数据;
输出动态数组的大小即可;
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
vector<int>a;
for(int i=1;i<=n;i++){
int x;
cin>>x;
x*=-1;
auto xx=upper_bound(a.begin(),a.end(),x)-a.begin();
if(xx==a.size()){
a.push_back(x);
}
else a[xx]=x;
}
cout<<a.size()<<endl;
return 0;
}
用一个动态数组存一个Pair<int,int>b
C大的排在前面,对a数组里的排序,用b数组里的最大值C换a数组里的最小值即可·,答案如下:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1000005];
vector<pair<int,int>>b;
bool cmp(pair<int,int>x,pair<int,int>y){
return x.second>y.second;
}
signed main(){
int sum=0;
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
for(int i=0;i<m;i++){
int bb,cc;
cin>>bb>>cc;
b.push_back(make_pair(bb,cc));
}
sort(b.begin(),b.end(),cmp);
sort(a,a+n);
int u=0;
for(auto p:b){
int ff=p.first;
int ss=p.second;
while(a[u]<ss&&ff!=0&&u<n){
if(ff!=0){
ff--;
sum-=a[u];
sum+=ss;
u++;
}
}
}
cout<<sum<<endl;
return 0;
}
用pair<int,int>b;定义动态数组,定义一个排序,从大到小排序,用大数换小数;
可以累加所有数据,然后加一个最大的C,减去数组中最小的B;
直到最大的数B不大于数组中的最小值就结束替换;
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1000005];
vector<pair<int,int>>b;
bool cmp(pair<int,int>x,pair<int,int>y){
return x.second>y.second;
}
signed main(){
int sum=0;
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
for(int i=0;i<m;i++){
int bb,cc;
cin>>bb>>cc;
b.push_back(make_pair(bb,cc));
}
sort(b.begin(),b.end(),cmp);
sort(a,a+n);
int u=0;
for(auto p:b){
int ff=p.first;
int ss=p.second;
while(a[u]<ss&&ff!=0&&u<n){
if(ff!=0){
ff--;
sum-=a[u];
sum+=ss;
u++;
}
}
}
cout<<sum<<endl;
return 0;
}