1、洛谷P1031 均分纸牌
#include<iostream>
#include<algorithm>
using namespace std;
#define N 107
int n,ans=0;
long long int a[N], num = 0;
int b[N] = { 0 };
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
num += a[i];
}
num /= n;
for (int i = 1; i <= n; i++) {
if (a[i] == num)
continue;
else
a[i + 1] += (a[i] - num);
ans++;
}
cout << ans;
}
2、P1007 独木桥
#include<iostream>
#include<algorithm>
using namespace std;
#define N 5007
int l, n,maxv=0,minv=0;
int a[N];
int main() {
cin >> l >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
maxv = max(maxv,max(a[i], l - a[i] + 1));
minv = max(minv,min(a[i], l - a[i] + 1));
}
cout <<minv<<" "<<maxv ;
return 0;
}
3、P1020 导弹拦截
附题解:点我
#include<iostream>
#include<algorithm>
#include<cstdio>
#include <cstdlib>
using namespace std;
#define N 100007
int a[N],n=1,dp[N],l,r,mid,ans=0, s = 1;
int main() {
while (cin>>a[n]) {
/*if (cin.get() == '\n')
break;*/
n++;
}
n--;
dp[0] = 50007;
dp[1] = a[1];
for (int i = 2; i <= n; i++) {
if (a[i] <= dp[s])
{
s++;
dp[s] = a[i];
}
else//二分查找
{
l = 0;
r = s;
while (l <= r) {
mid = (l + r) / 2;
if (dp[mid] >= a[i]) {
ans = mid;
l = mid + 1;
}
else
r = mid - 1;
}
dp[ans + 1] = a[i];//替换
}
}
cout << s<<endl;
s = 0,ans=0;
int maxs;
while (s < n) {
maxs = 50007;
for (int i = 1; i <= n; i++) {
if (a[i] <= maxs && a[i] >= 0)
{
maxs=a[i];
s++;
a[i] = -1;
}
}
ans++;
}
cout << ans ;
return 0;
}
4、P5020 货币系统
#include<iostream>
#include<algorithm>
using namespace std;
#define N 107
int t, n;
int main() {
cin >> t;
while (t--) {
cin >> n;
int ok[25007] = { 0 }, a[N];
for (int i = 1; i <= n; i++) {
cin >> a[i];
ok[a[i]] = 2;
}
sort(a + 1, a + 1 + n);
for (int i = 1; i <= a[n]; i++) {
if (ok[i] > 0)
{
for (int j = 1; j <= n; j++) {
int _x = a[j] + i;
if (_x > a[n])
break;
ok[_x] = 1;//凑出来的
}
}
}
int ans = 0;
for (int i = 1; i <=n; i++) {
if (ok[a[i]] == 2)
ans++;
}
cout << ans<<endl;
}
return 0;
}