BestCoder Round #86 A B C

时间:2022-05-29 02:33:23

这次BC终于不像上次一样惨烈 终于A了三题……

终测ing……

发一波题解……

A.Price List

A题十分无脑 只要把所有数加起来存到sum里 询问的时候大于sum输出1 否则输出0就行了……

犹豫了好久 怎么会这么简单……

看群里好多人卡在了%I64d……

 #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<string>
#include<map>
#include<vector>
#include<queue>
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
long long sum=,a;
for(int i=;i<n;i++){
scanf("%I64d",&a);
sum+=a;
}
for(int i=;i<m;i++){
scanf("%I64d",&a);
if(a>sum) printf("");
else printf("");
}
puts("");
}
return ;
}

B.NanoApe Loves Sequence

B题就是自行模拟一下就好了……

cha[i]是这个数和前一个数的差……

记录最大的差maxc和i的位置loc……

首先处理去掉开头和结尾的情况……

然后处理中间的情况……

处理到loc和loc-1单独处理……

边界没处理好 WA了6次……

感觉是做麻烦了……

 #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<string>
#include<map>
#include<vector>
#include<queue>
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
int num[];
int cha[];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
int loc;
int maxc=-;
int maxn=-;
long long ans=;
scanf("%d",&n);
scanf("%d",&num[]);
for(int i=;i<n;i++){
scanf("%d",&num[i]);
cha[i]=abs(num[i]-num[i-]);
if(cha[i]>maxc){
maxc=cha[i];
loc=i;
}
}
for(int i=;i<n;i++){
if(cha[i]>maxn) maxn=cha[i];
}
// printf("%d\n",maxn);
ans+=maxn;
maxn=-;
for(int i=;i<n-;i++){
if(cha[i]>maxn) maxn=cha[i];
}
// printf("%d\n",maxn);
ans+=maxn;
for(int i=;i<n-;i++){
if(loc==i){
int used=-;
for(int j=;j<n;j++){
if(j==i+) continue;
if(j==i){
if(used<abs(num[i+]-num[i-]))
used=abs(num[i+]-num[i-]);
}
else if(cha[j]>used) used=cha[j];
}
ans+=used;
continue;
}
if(loc-==i){
int used=-;
for(int j=;j<n;j++){
if(j==loc) continue;
if(j==loc-){
if(used<abs(num[j+]-num[j-]))
used=abs(num[j+]-num[j-]);
}
else if(cha[j]>used) used=cha[j];
}
ans+=used;
continue;
}
if(maxc>abs(num[i+]-num[i-])) ans+=maxc;
else ans+=abs(num[i+]-num[i-]);
// printf("%I64d\n",ans);
}
printf("%I64d\n",ans);
}
return ;
}

C.NanoApe Loves Sequence Ⅱ

记录下当前位置是从开始第几大……
然后累加当前位置结尾的倒数第k大的位置……
讲道理这道题很看感觉……
 #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<string>
#include<map>
#include<vector>
#include<queue>
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
int num[];
int p[];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int tmp=;
long long ans=;
for(int i=;i<n;i++){
scanf("%d",&num[i]);
if(num[i]>=m){
p[tmp++]=i;
if(tmp>=k)
ans+=(p[tmp-k]+);
}
else if(i+>=k&&tmp>=k)
ans+=(p[tmp-k]+);
}
printf("%I64d\n",ans);
}
return ;
}