PAT甲级 易超时问题

1055. The World’s Richest (25)

题目地址

https://www.patest.cn/contests/pat-a-practise/1055

ac

需要根据年龄人数最多100过滤

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack> 
#include <map> 
#include <set> 

using namespace std;

const int INF = 0x7fffffff;
const int MIN_INF = - INF -1;
typedef long long int LL;

int n, k;

struct data
{
  string name;
  int age;
  int wealth;
};

bool cmp(data d1, data d2)
{
  if(d1.wealth > d2.wealth)
  {
    return true;
  }else if(d1.wealth == d2.wealth)
  {
    if(d1.age < d2.age)
      return true;
    else if(d1.age == d2.age)
    {
      if(d1.name < d2.name)
        return true;
    }
  }
  return false;
}

int main()
{
  //freopen("in.txt","r",stdin);

  while(scanf("%d%d", &n,&k) != EOF)
  {
    vector<data> vp;
    data dt;
    // 输入
    vector<data> vd; 
    for(int i=0;i<n;i++)
    {
      cin >> dt.name >> dt.age >> dt.wealth;
      if(dt.age > 0 && dt.age <= 200)
      {
        vd.push_back(dt);
      }
    }

    sort(vd.begin(), vd.end(), cmp);

    vector<int> ageCnt(201,0);
    // 过滤,每个年龄不能超过100人
    for(int i=0;i<n;i++)
    {
      if(ageCnt[vd[i].age] < 100)
      {
        ageCnt[vd[i].age] ++;
        vp.push_back(vd[i]);
      }
    }
    int vpLen = vp.size();

    // solve
    int m, ageMin,ageMax;
    for(int i = 0; i < k; i++)
    {
      scanf("%d%d%d", &m,&ageMin, &ageMax);

      vector<data> vt;
      int vtLen = 0;
      for(int j = 0;j<vpLen;j++)
      {
        if(vtLen >= m)
        {
          break;
        }
        if(vp[j].age >= ageMin && vp[j].age <= ageMax && vtLen < m)
        {
          vt.push_back(vp[j]);
          vtLen ++;
        }
      }
      /*
      for(int j = ageMin;j <= ageMax;j++)
      {
        int len = vp[j].size();
        for(int l= 0;l <len;l++)
        {
          vt.push_back(vp[j][l]);
        }
      }
      */

      printf("Case #%d:\n", i+1);
      //int vtLen = vt.size();
      if(vtLen == 0)
      {
        printf("None\n");
      }else{
        sort(vt.begin(), vt.end(),cmp);
        //int len2 = min(m,vtLen);
        for(int j=0;j<vtLen;j++)
        {
          cout << vt[j].name << " " << vt[j].age << " " << vt[j].wealth << endl;
        }
      }
    }

  }

  return 0;
}

1063. Set Similarity (25)

题目地址

https://www.patest.cn/contests/pat-a-practise/1063

ac

主要是set处理

ac1,利用set_intersection

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack> 
#include <map> 
#include <set> 
#include <unordered_map>

using namespace std;

const int INF = 0x7fffffff;
const int MIN_INF = - INF -1;
typedef long long int LL;

int n;
int m;
int k;

struct cmp{
  bool operator()(int a,int b)
  {
    return a < b;
  }
};

bool cmp2(int a,int b)
{
  return a < b;
}

int main()
{
  //freopen("in.txt","r",stdin);

  while(scanf("%d", &n) != EOF)
  {
    set<int> vt[51];
    vector<int> cnt(51,0);

    for(int i=0;i<n;i++)
    {
      scanf("%d",&m);
      int tmp;
      vt[i+1].clear();

      for(int j=0;j<m;j++)
      {
        scanf("%d",&tmp);
        vt[i+1].insert(tmp);
      }
      cnt[i+1] = vt[i+1].size(); 
    }

    scanf("%d",&k);
    int no1, no2;
    for(int i=0;i<k;i++)
    {
      scanf("%d%d", &no1, &no2);

      int cnt1 = cnt[no1];
      int cnt2 = cnt[no2];

      int vLen = max(cnt1,cnt2);
      vector<int> v(vLen, -1);
      set_intersection(vt[no1].begin(),vt[no1].end(),vt[no2].begin(),vt[no2].end(),
        v.begin());

      /*vector<int> v2(cnt1 + cnt2 , -1);
      set_union(vt[no1].begin(),vt[no1].end(),vt[no2].begin(),vt[no2].end(),
        v2.begin());*/

      int nc = 0;
      //int nt = 0;
      int len = v.size();
      while(nc < vLen && v[nc] != -1)
        nc ++;
      printf("%.1f%%\n",(1.0*nc)/(1.0*(cnt[no1] + cnt[no2] - nc)) * 100);
    }
  }
  return 0;
}

ac2, 直接set.find()

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack> 
#include <map> 
#include <set> 
#include <unordered_map>

using namespace std;

const int INF = 0x7fffffff;
const int MIN_INF = - INF -1;
typedef long long int LL;

int n;
int m;
int k;

int main()
{
  //freopen("in.txt","r",stdin);

  while(scanf("%d", &n) != EOF)
  {
    set<int> vt[51];
    vector<int> cnt(51,0);

    for(int i=0;i<n;i++)
    {
      scanf("%d",&m);
      int tmp;
      vt[i+1].clear();

      for(int j=0;j<m;j++)
      {
        scanf("%d",&tmp);
        vt[i+1].insert(tmp);
      }
      cnt[i+1] = vt[i+1].size(); 
    }

    scanf("%d",&k);
    int no1, no2;
    for(int i=0;i<k;i++)
    {
      scanf("%d%d", &no1, &no2);

      int nc = 0;

      set<int>::iterator it = vt[no2].begin();
      while(it != vt[no2].end())
      {
        int val = *it;
        if(vt[no1].find(*it) != vt[no1].end())
          nc ++;
        ++it;
      }

      printf("%.1f%%\n",(1.0*nc)/(1.0*(cnt[no1] + cnt[no2] - nc)) * 100);
    }
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值