#include
using namespace std;
const int N = 3e5 + 10;
int w, n, ans, a[N];
int main()
{
cin >> w >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
}
sort(a + 1, a + 1 + n);
for(int i = 1, j = n; i <= j;)
{
if(a[i] + a[j] <= w)
{
ans ++;
i ++;
j --;
}
else
{
ans ++;
j --;
}
}
cout << ans;
return 0;
}
B不需要一一列举,直接A - C即可
#include
using namespace std;
const int N = 3e5 + 10;
map mp;
long long n, c, ans, a[N];
int main()
{
cin >> n >> c;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
mp[a[i]] ++;
}
for(int i = 1; i <= n; i ++)
{
ans += mp[a[i] - c];
}
cout << ans;
return 0;
}
将其按关键字排序,从后往前不断找,找到即停。初始赋值为0,没有找到则就为0.
#include
using namespace std;
const int N = 2e5 + 10;
int n;
struct node
{
int h, l, r, num;
}a[N], b[N];
pair ans[N];
bool cmp(node x, node y)
{
if(x.h != y.h) return x.h < y.h;
else return x.num > y.num;
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i].h >> a[i].l >> a[i].r;
a[i].num = i;
}
sort(a + 1, a + 1 + n,cmp);
for(int i = 1; i <= n; i ++)
{
int x = 0, y = 0;
for(int j = i - 1; j >= 1; j --)
{
if(a[j].l < a[i].l && a[j].r > a[i].l && a[j].h < a[i].h)
{
x = a[j].num;
break;
}
}
for(int j = i - 1; j >= 1; j --)
{
if(a[j].l < a[i].r && a[j].r > a[i].r && a[j].h < a[i].h)
{
y = a[j].num;
break;
}
}
ans[a[i].num] = {x, y};
}
for(int i = 1; i <= n; i ++)
{
cout << ans[i].first << ' ' << ans[i].second << '\n';
}
return 0;
}
模板
将时间从小到大进行排序,初始化每一个点为一个集合,如果当前这个点以及所在的集合没有被加入那就将其加入集合,统计集合中点的个数,如果达到值就输出最小时间。
#include
using namespace std;
const int N = 1e5 + 10;
int n, m, pre[N], cnt[N];
struct node
{
int x, y, t;
}a[N];
bool cmp(node x, node y)
{
return x.t < y.t;
}
int find(int x)
{
if(pre[x] != x)pre[x] = find(pre[x]);
return pre[x];
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++)
{
pre[i] = i;
cnt[i] = 1;
}
for(int i = 1; i <= m; i ++)
{
cin >> a[i].x >> a[i].y >> a[i].t;
}
sort(a + 1, a + 1 + m, cmp);
for(int i = 1; i <= m; i ++)
{
if(find(a[i].x) == find(a[i].y))continue;
cnt[find(a[i].y)] += cnt[find(a[i].x)];
pre[find(a[i].x)] = find(a[i].y);
if(cnt[find(a[i].y)] == n)
{
cout << a[i].t;
return 0;
}
}
cout << -1;
return 0;
}
#include
using namespace std;
const int N = 2e5 + 10;
int n, a[N], dp[N];
int ans = -1010;
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
}
for(int i = 1; i <= n; i ++)
{
dp[i] = max(a[i], dp[i - 1] + a[i]);
}
for(int i = 1; i <= n; i ++)
{
ans = max(ans, dp[i]);
}
cout << ans;
return 0;
}