P1031 [NOIP2002 提高组] 均分纸牌
原题链接 https://www.luogu.com.cn/problem/P1031
解题思路 如果发现这个牌堆少了,就从后面一个要,多了就丢后面去
代码
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int a[N];
int main()
{
int n;cin >> n;
long long sum=0;
int aver=0;
for(int i=1;i<=n;i++)
{
cin >> a[i];
sum+=a[i];
}
aver = sum/n;
int ans=0;
for(int i=1;i<n;i++)
{
if(a[i]<aver)
{
ans++;
a[i+1]=a[i+1]-aver+a[i];
}
if(a[i]>aver)
{
ans++;
a[i+1]=a[i+1]+a[i]-aver;
}
}
cout << ans << endl;
}
# P1094 [NOIP2007 普及组] 纪念品分组
### 原题链接 https://www.luogu.com.cn/problem/P1094
#### 解题思路:先对纪念品的价进行排序,默认分组数为纪念品数量,然后使用双指针算法,如果a[l]+a[r]<=w ans--;
### 代码
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int a[N];
int main()
{
int w,n;cin >> w >> n;
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
sort(a+1,a+n+1);
int l=1,r=n;
int ans=n;
while(l<r)
{
if(a[l]+a[r]<=w)
{
ans--;
l++,r--;
}
else
{
r--;
}
}
cout << ans << endl;
}
P1109 学生分组
原题链接:https://www.luogu.com.cn/problem/P1109
解题思路 : 如果平均每个分组的学生要<l||>r 的话那么久不可能满足条件 输出-1 然后用贪心思想
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int a[N];
int main()
{
int n;cin >>n;
int sum=0;
for(int i=1;i<=n;i++)
{
cin >> a[i];
sum+=a[i];
}
int l,r;
cin >> l >> r;
if(sum*1.0/n<l||sum*1.0/n>r)
{
cout << -1;
return 0;
}
int v1=0;
int v2=0;
for(int i=1;i<=n;i++)
{
if(a[i]>r)
{
v1+=a[i]-r;
}
else if(a[i]<l)
{
v2+=l-a[i];
}
}
cout << max(v1,v2);
}