PAT (Advanced Level) 1029 队列解决中位数问题 解决内存超限 1117 思维 堆 1063 STL set_union 1120 水题 C++ 交换两个变量的值做法

PAT 1029

队列的思想还是不太好想到,内存要求很高,只有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;
}

PAT 1117

#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;
}

PAT 1063

本来使用了离散化的思想,但是最后一个点超时,看来是查询次数太多导致复杂度过高,接着使用了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;
}

PAT 1120

#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;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值