上午 vjcon3补题
优先队列维护贪心
取一个数的各位只需要
a/100%10,a/10%10,a%10;
去重
bool(int n)
{
set<int>st;
for(int j=0;j<n;j++)
{
st.insert(a[i][j]);
}
if(st.size()!=n)
return 1;
return 0;
}
中位数 (思维)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
int s1=0,s2=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int buf;
scanf("%d",&buf);
if(buf<m) s2++;
else s1++;
}
/**
这样理解吧,记大于等于m的数为ai,小于m的为bj。
每一个含p个bj的序列,就要有p+1个ai的元素
统计ai与bj的数,直接做差跟0取最值即可
**/
printf("%d\n",max(0,s1-s2));
return 0;
}
下午
map和pair,vector
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
// 存每个数的因数对
vector<pair<int, int>> q[maxn];
int main() {
// 示例数据填充
q[1].push_back({1, 1});
q[2].push_back({1, 2});
q[2].push_back({2, 1});
// 访问第 i 对元素,示例以 i=2 为例
int i = 2; // 这里的 i 是你想要访问的索引
if (!q[i].empty()) { // 确保 vector 不为空
// 访问第一个 pair
pair<int, int> p = q[i].front(); // 获取第一个 pair
// 获取第一个和第二个元素
int first = p.first;
int second = p.second;
cout << "First element: " << first << endl;
cout << "Second element: " << second << endl;
// 删除第一个 pair
q[i].erase(q[i].begin()); // 删除第一个 pair
} else {
cout << "The vector is empty!" << endl;
}
return 0;
}
// 示例操作:访问第二个 pair 元素的第一个和第二个元素
if (q[i].size() > 1) { // 确保 vector 至少有两个元素
pair<int, int> p = q[i][1]; // 访问第二个 pair
int first = p.first;
int second = p.second;
cout << "First element of second pair: " << first << endl;
cout << "Second element of second pair: " << second << endl;
}
// 示例操作:打印所有因数对
for (const auto& p : q[i]) {
cout << p.first << " " << p.second << endl;
}
// 示例操作:清空整个 vector
q[i].clear();
map
#include <bits/stdc++.h>
using namespace std;
int main() {
// 创建一个 map<int, int>
map<int, int> mp;
mp[1] = 10;
mp[2] = 20;
mp[3] = 30;
// 获取第一个键值对
if (!mp.empty()) { // 确保 map 不为空
auto it = mp.begin(); // 获取指向第一个键值对的迭代器
int key = it->first; // 获取第一个键
int value = it->second; // 获取第一个值
auto it = mp.begin(); // 获取第一个键值对的迭代器
int key = (*it).first; // 访问键
int value = (*it).second; // 访问值
总结 it->first 或 (*it).first
cout << "First key: " << key << endl;
cout << "First value: " << value << endl;
} else {
cout << "The map is empty!" << endl;
}
return 0;
}
auto it = mp.begin(); // 获取第一个键值对
while (it != mp.end()) {
cout << "Key: " << it->first << ", Value: " << it->second << endl;
++it; // 移动到下一个键值对
}
mp.erase(1); // 删除键为 1 的元素
auto it = mp.begin();
mp.erase(it); // 删除迭代器指向的元素
auto it = mp.find(2); // 查找键为 2 的元素
if (it != mp.end()) {
cout << "Found key 2 with value: " << it->second << endl;
} else {
cout << "Key 2 not found" << endl;
}
运用 求解因数对数量
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
int n,m;
bool st[maxn];
vector<pair<int,int>> a;
int q[maxn];
int la[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1; i<=n; i++)
{
int x;
cin>>x;
if(st[x]==1)
{
a.push_back({q[x],x/q[x]});
st[x]=0;
}
else
{
int f=0;
for(int j=la[x]+1; j*j<=x; j++)
{
la[x]=j;
if(x%j==0)
{
a.push_back({j,x/j});
if(j!=x/j)
{
q[x]=x/j;
st[x]=1;
}
f=1;
break;
}
}
if(f==0)
{
cout<<"NO"<<endl;
return 0;
}
}
}
cout<<"YES"<<endl;
for(auto t:a)
{
cout<<t.first<<" "<<t.second<<endl;
}
}
飞机降落
没看懂呢
另:
con2约数
另一种做法还是不懂
void solve()
{
int a, b, i;
cin >> a >> b;
int ans = 0;
// 遍历所有可能的因数 i,从 1 到 sqrt(b)
for (i = 1; i * i <= b; i++)
{
// 找到在区间 [a, b] 内第一个能被 i 整除的数 d
int d = (a / i) * i;
// 确保 d 是在 [a, b] 区间内的第一个有效的数
while (d < a || i * i > d)
{
d += i;
}
// 对于区间 [d, b] 内的所有 d, d 是 i 的倍数
for (; d <= b; d += i)
{
ans += i; // i 是 d 的一个因数
// 如果 i 和 d / i 是不同的因数,将 d / i 也加上
if (i < d / i)
{
ans += d / i;
}
}
}
cout << ans << endl; // 输出区间 [a, b] 内所有数的约数和
}
晚上