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