第一题:期末预测之安全指数
简单,暴力求解即可。



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