队列的思想还是不太好想到,内存要求很高,只有1.5MB
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
int n;
scanf("%d",&n);
queue<int>pq;
while(!pq.empty()) pq.pop();
for(int i=0;i<n;i++)
{
int k;
scanf("%d",&k);
pq.push(k);
}
pq.push(INF);
queue<int>q;
while(!q.empty()) q.pop();
int m;
scanf("%d",&m);
int pos=(n+m+1)/2;
pos--;
int sum=0,solve;
bool flag=false;
for(int i=0;i<m;i++)
{
int k;
scanf("%d",&k);
q.push(k);
if(sum==pos) {
solve=min(pq.front(),q.front());
flag=true;
}
if(flag) continue;
if(pq.front()<q.front()) pq.pop();
else q.pop();
sum++;
}
q.push(INF);
if(flag) cout<<solve<<endl;
else {
for(;sum<pos;sum++)
{
if(pq.front()<q.front()) pq.pop();
else q.pop();
}
solve=min(pq.front(),q.front());
cout<<solve<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
priority_queue<int>pq;
while(!pq.empty()) pq.pop();
for(int i=0;i<n;i++)
{
int k;
scanf("%d",&k);
pq.push(k);
}
int ans=1;
while(!pq.empty())
{
int k=pq.top();
pq.pop();
if(k<=ans) break;
ans++;
}
cout<<ans-1<<endl;
return 0;
}
本来使用了离散化的思想,但是最后一个点超时,看来是查询次数太多导致复杂度过高,接着使用了set的用法才过。
set的用法,使用set_union求并集,使用set_intersection求交集
//set_union set_intersection
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
const int maxn=100+5;
int main()
{
set<int>G[maxn];
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int m;
scanf("%d",&m);
while(m--)
{
int k;
scanf("%d",&k);
G[i].insert(k);
}
}
int q;
scanf("%d",&q);
while(q--)
{
int l,r;
scanf("%d%d",&l,&r);
int solve1=0,solve2=0;
set<int>str;
str.clear();
set_intersection(G[l].begin(), G[l].end(), G[r].begin(), G[r].end(), inserter(str,str.begin()));
solve1=str.size();
solve2=G[l].size()+G[r].size()-solve1;
printf("%.1f%\n",1.0*solve1/solve2*100.0);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
set<int>str;
str.clear();
for(int i=0;i<n;i++)
{
int k;
scanf("%d",&k);
int sum=0;
while(k)
{
sum+=(k%10);
k/=10;
}
str.insert(sum);
}
set<int>::iterator it;
it=str.begin();
vector<int>vec;
vec.clear();
for(;it!=str.end();it++)
vec.push_back((*it));
cout<<vec.size()<<endl;
printf("%d",vec[0]);
for(int i=1;i<vec.size();i++)
printf(" %d",vec[i]);
cout<<endl;
return 0;
}
C++交换两个变量的值的3种方法
1. 三变量交换法
//1. 3变量交换法
int a=3,b=4;
int c;
c=a;
a=b;
b=c;
cout<<a<<" "<<b<<endl;
2.不需要额外变量,使用加减运算实现
//2. 不需要额外变量
a=a+b;
b=a-b;
a=a-b;
cout<<a<<" "<<b<<endl;
3.不需要额外变量,使用位运算,十分巧妙
使用了异或运算的相关性质
// 3.利用位运算 异或性质 一个数异或其本身为0
a=a^b;
b=a^b;
a=a^b;
cout<<a<<" "<<b<<endl;