第21次CSP前两题

第一题:期末预测之安全指数

简单,暴力求解即可。

#include<iostream>
#include<algorithm>

using namespace std;

int main(){
	int n,wi,si;
	cin>>n;
	int sum = 0;
	for(int i=0 ; i<n ; i++){
		cin>>wi>>si;
		sum += wi*si;
	}
	if(sum > 0) cout<<sum<<endl;
	else cout<<"0"<<endl;
	return 0;
} 

第二题:期末预测之最佳阈值 

提示:排序+前缀和

//用数组存储数据,两个数字有关系,下标相等的即表示输入的一组<y,r>
//而后用快排对y进行从小到大排序,注意交换数据时,对应的r值也要交换,且要保证,y值相同的,r值为1的在后,不然后期处理大批量数据会出错,虽然理论上没找到错的原因,但是测试案例只能通过11/14
//快排:
void quick_sort(int q[] ,int p[], int l,int R){
	if(l >= R) return;
	int i=l-1 , j=R+1 , x=q[ (l+R) >>1];
	while(i<j){
		do i++; while(x > q[i] );
		do j--; while(x < q[j] );
		if(i<j) {
		    if(q[i] != q[j]){
		        swap(q[i] , q[j]);
			    swap(p[i] , p[j]);
		    }
		    else if(q[i] == q[j] && p[i]>p[j]){
		        swap(q[i] , q[j]);
			    swap(p[i] , p[j]);
		    }
			
		}
	}
	quick_sort(q,p,l,j);
	quick_sort(q,p,j+1,R);
}
//完整代码
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

//acwing 14/14
const int N = 100010;
int y[N],r[N];
int num_1[N];
int num_0[N];
int g[N];

void quick_sort(int q[] ,int p[], int l,int R){
	if(l >= R) return;
	int i=l-1 , j=R+1 , x=q[ (l+R) >>1];
	while(i<j){
		do i++; while(x > q[i] );
		do j--; while(x < q[j] );
		if(i<j) {
		    if(q[i] != q[j]){
		        swap(q[i] , q[j]);
			    swap(p[i] , p[j]);
		    }
		    else if(q[i] == q[j] && p[i]>p[j]){
		        swap(q[i] , q[j]);
			    swap(p[i] , p[j]);
		    }
			
		}
	}
	quick_sort(q,p,l,j);
	quick_sort(q,p,j+1,R);
}

int main(){
	int n;
	cin>>n;
	
	memset(y,0,sizeof y);
	memset(r,0,sizeof r);
	
	for(int i=1 ; i<=n ; i++) cin>>y[i]>>r[i];
	
	quick_sort(y,r,1,n);
	
//	for(int i=1 ; i<=n ; i++) cout<<y[i]<<" "<<r[i]<<endl;

	num_0[0] = 0;
	num_1[0] = 0;
	for(int i=1 ; i<=n ; i++){
		if(r[i] == 0) {
			num_0[i] = num_0[i-1] + 1;
			num_1[i] = num_1[i-1];
		}
		else if(r[i] == 1){
			num_0[i] = num_0[i-1];
			num_1[i] = num_1[i-1] + 1;
		}
		 
	}
	
	int sum = 0;
    int t = -1;
    for(int i=1 ; i<=n ; i++){
        int tmp = num_0[i-1] + num_1[n] - num_1[i-1];
        if(tmp >= sum){
            sum = tmp;
            t = i;
        }
      while((i+1) <=n && y[i] == y[i+1]) i++;
    }

    cout<<y[t]<<endl;
    return 0;
	
} 
//使用C++中的pair<int,int>,可以有效简化代码,思路一样,代码如下
#include<iostream>
#include<algorithm>
#include<queue>

using namespace std;

typedef pair<int,int>PII;
const int N = 100010;

int n;
PII q[N];
int s[2][N];

int main(){
	cin>>n;
	for(int i=1 ; i<=n ; i++) cin>>q[i].first>>q[i].second;
	
	sort(q+1 , q+n+1);
	
	for(int i=1 ; i<=n ; i++){
		for(int j=0 ; j<2 ; j++){
			s[j][i] = s[j][i-1] + (j==q[i].second);
		}
	}
	
	int cnt = -1,res;
	for(int i=1 ; i<=n ; i++){
		int t = s[0][i-1] + s[1][n] - s[1][i-1];
		if(t >= cnt){
			cnt = t;
			res = q[i].first;
		}
		while(i+1<=n && q[i+1].first ==q[i].first) i++;
	}
	
	cout<<res<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值