http://codeforces.com/problemset/problem/760/B
题意就是分枕头,每人至少一个,相邻之间差距不能大于1个,问第k个人最多能分多少枕头。
这道题只要从第k个人开始向上类似于金字塔一样的累加即可,要注意k很可能在边缘,这就要注意在加的过程中要少加几个。
#include<bits/stdc++.h>
using namespace std; long long int a[555][555];
long long int b[555];
long long int c[555];
int main(){
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
int zjs=0;
int yjs=0;
int i=0;
int z=k-1;
int y=n-k;
int ans=1;
int cs=1;
m=m-n;
while(m>=cs*2-1-zjs-yjs)
{
ans++;
m-=cs*2-1-zjs-yjs;
cs++;
if(cs>=z+2)zjs++;
if(cs>=y+2)yjs++;
if(cs*2-1-zjs-yjs==n)
{
ans+=m/n;
break;
}
}
cout<<ans<<endl;
}
return 0;
}

本文解析了Codeforces上编号为760/B的问题——分枕问题。该问题要求每人至少获得一个枕头,且相邻两人获得的枕头数相差不超过一个,求解第k个人最多能得到多少枕头。通过一种类似金字塔的方式进行累加,特别注意边界条件的处理。
1476

被折叠的 条评论
为什么被折叠?



