VJ 补题
E - MaratonIME does (not do) PAs
思路:用贪心的思路,因为最终减去的值就是所有截止时间的和,所以截止时间不用做处理,只需要把每个题目的罚时从小到大排序然后进行处理,最后减去截止时间的和
老规矩,错误代码奉上:
#include<bits/stdc++.h>
#include
using namespace std;
void qs(int a[],int l, int r)
{
int i = l, j = r, key1 = a[l];
if(l>=r)
return;
else
{
while(i<j)
{
while(i<j&&a[j]>=key1)
j–;
{
a[i] = a[j];
}
while(i < j&&a[i] <= key1)
i++;
{
a[j] = a[i];
}
}
a[i] = key1;
}
qs(a,i+1,r);
qs(a,l,i-1);
}
int main()
{
int n, s, a[110000], b[110000];
cin>>n>>s;
for(int i = 1;i<=n;i++)
{
cin>>a[i]>>b[i];
}
qs(a,b,1,n);
long long sum1 = 0, sum2 = 0, sum3 = s;
for(int i = 1;i<=n;i++)
{
sum3 = sum3 + a[i];
sum1=sum1 + sum3;;
sum2+=b[i];
}
cout<<sum1-sum2<<endl;
return 0;
}
代码错误在于超时,开始我直接暴力排序,超时,换了快排还是超时,借鉴了大佬们的代码,有两个地方可以改进,一个是用结构体数组来储存数据,还有用sort函数进行排序 sort函数时间复杂度为n*log2(n),快速排序的平均时间复杂度也是:O(nlogn),sort函数效率要高于手写的快排;还有,由于该题测试数据比较大,所以把变量定义成了long long类型
修改后的代码:
#include<bits/stdc++.h>
#include
#define N 5005
using namespace std;
struct node
{
long long l;
long long e;
}q[100001];
bool cmp(struct node a, struct node b)
{
return a.l<b.l;
}
int main()
{
long long n, t, i, sum, num;
cin>>n>>t;
for(i=1;i<=n;i++)
cin>>q[i].l>>q[i].e;
sort(q+1,q+1+n,cmp);
sum=0;
for(int i=1;i<+n;i++)
{
t = t+q[i].l;
sum = sum + t;
num+=q[i].e;
}
cout<<sum-num<<endl;
return 0;
}
由于VJ暂时不能提交测试,所以不知道修改后的代码是否存在问题,发现问题的朋友一定要给小弟指正哦