暑期DAY1;

Dice and Coin - SMUOJ

题解:求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;
}

Sequence Decomposing - SMUOJ

求升序序列有多少个:

可以用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;
}

Integer Cards - SMUOJ

用一个动态数组存一个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;
}

Hcode OnlineJudge

用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;
}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值