Codeforces Round #727 (Div. 2)
(所有数据都要开long long)
A. Contest Start
分类讨论,一种是n大于所包含人数的区间长度,另一种是小于等于.
#include<cstdio>
using namespace std;
int main()
{
int k;
scanf("%d",&k);
while(k--)
{
long long int n,x,t;
scanf("%lld%lld%lld",&n,&x,&t);
long long int dis=t/x;
long long int ans1=0;
long long int ans2=0;
if(n>dis)
{
ans1=dis*(n-dis);
ans2=(dis-1)*dis/2;
}
else ans1=(n-1)*n/2;
printf("%lld\n",ans1+ans2);
}
return 0;
}
B. Love Song
把字母转换成数字,算一个前缀和,答案就是pre[r]-pre[l-1].
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=1e5+10;
char s[maxn];
long long int pre[maxn];
int main()
{
int n,q;
scanf("%d%d",&n,&q);
cin >> s+1;
for(int i=1;i<=n;i++)
{
pre[i]=(s[i]-'a'+1)+pre[i-1];
}
while(q--)
{
int l,r;
scanf("%d%d",&l,&r);
printf("%lld\n",pre[r]-pre[l-1]);
}
return 0;
}
C. Stable Groups
贪心:进行两遍排序,第一遍从小到大排序,算出不加数字的区间的个数;统计每个区间之间所需要添加数字的个数,之后由小到大排序。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
long long int f[maxn];
long long int w[maxn];
bool comp(long long int a,long long int b)
{
return a<b;
}
int main()
{
long long int n,k,x;
scanf("%lld%lld%lld",&n,&k,&x);
for(int i=1;i<=n;i++)
{
scanf("%lld",&f[i]);
}
sort(f+1,f+n+1,comp);
long long int pos=1;
int cnt=1,g=0;
for(int i=1;i<n;i++)
{
if(f[i+1]-f[i]>x)
{
w[++g]=(f[i+1]-f[i])/x;
if(w[g]*x<f[i+1]-f[i]) w[g]++;
w[g]--;
cnt++;
}
}
sort(w+1,w+g+1,comp);
for(int i=1;i<=g;i++)
{
if(k<w[i]) break;
else
{
k-=w[i];
cnt--;
}
}
printf("%d",cnt);
return 0;
}
D. PriceFixed
双指针进行模拟:对每个物品的bi从小到大排序,用cnt记录已经买了物品的个数,如果现在cnt已经大于等于首位物品的bi已经那就从左边开始购买,否则从右边.
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e6+10;
struct things
{
long long int a;
long long int b;
}v[maxn];
bool comp(things x,things y)
{
if(x.b==y.b) return x.a<y.a;
return x.b<y.b;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&v[i].a,&v[i].b);
}
sort(v+1,v+n+1,comp);
long long int cnt=0;
long long int ans=0;
int l=1,r=n;
while(l<=r)
{
if(cnt>=v[l].b)
{
cnt+=v[l].a;
ans+=v[l].a;
v[l].a=0;
l++;
continue;
}
if(cnt+v[r].a==v[l].b)
{
ans+=2*v[r].a;
cnt+=v[r].a;
r--;
continue;
}
if(cnt+v[r].a>v[l].b)
{
long long int d=v[l].b-cnt;
ans+=2*d;
cnt+=d;
v[r].a-=d;
continue;
}
if(cnt+v[r].a<v[l].b)
{
ans+=2*v[r].a;
cnt+=v[r].a;
r--;
continue;
}
}
printf("%lld",ans);
return 0;
}