一、//第一题签到题
#include<bits/stdc++.h>
using namespace std;
int sum=0;
int main(){
int N;scanf("%d",&N);
for(int i=0;i<N;i++){
int a,b;scanf("%d%d",&a,&b);
sum+=a*b;
}
if(sum>=0) printf("%d",sum);
else printf("0");
return 0;
}
二、第二题 快排+前缀和+细节处理
//期末预测之最佳阈值
关注点:
使用前缀和的时候,统计前n-1个数字里面的0的数目,统计后面的数字中的1的个数,但是如果有相同的数字的时候,只能统计第一个数字,后面的所有都不再准确。
举例如下:
/*
输入:
5
5 0
5 0
5 0
5 0
5 0
输出:
5
*/
上述例子,第一个5的统计,可以得到:0+0
第二个5的统计,可以得到:1+0
第三个5的统计,可以得到:2+0以此类推,所以遇到同样的数字往后跳
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int v[N],p[N];
int s0[N],s1[N];
void qsort(int l,int r,int q[]){
if(l>=r) return;
int i=l-1,j=r+1,x=q[l+r>>1];
while(i<j){
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j){
swap(q[i],q[j]);
swap(p[i],p[j]);
}
}
qsort(l,j,q),qsort(j+1,r,q);
}
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&v[i],&p[i]);
}
qsort(1,n,v);
for(int i=1;i<=n;i++){
if(p[i]==0){
s0[i]=s0[i-1]+1;
s1[i]=s1[i-1];
}else{
s1[i]=s1[i-1]+1;
s0[i]=s0[i-1];
}
}
int nmax=0,maxv=v[1];
int kk=0;
for(int i=1;i<=n;i++){
while(v[i]==v[i-1]&&i+1<=n) i++;
int sum=s0[i-1];
sum+=s1[n]-s1[i-1];
if(sum>=nmax){
maxv=v[i];
nmax=sum;
}
}
printf("%d",maxv);
return 0;
}
三、