PAT_(STL使用)set_string 1063 Set Similarity (25分) 1060 Are They Equal (25分)

目录

1063 Set Similarity (25分)

1060 Are They Equal (25分)


 

1063 Set Similarity (25分)

Given two sets of integers, the similarity of the sets is defined to be N​c​​/N​t​​×100%, where N​c​​ is the number of distinct common numbers shared by the two sets, and N​t​​ is the total number of distinct numbers in the two sets.

Your job is to calculate the similarity of any given pair of sets.

Input Specification:

Each input file contains one test case. Each case first gives a positive integer N (≤50) which is the total number of sets. Then N lines follow, each gives a set with a positive M (≤10^​4​​) and followed by M integers in the range [0,10^​9​​].

After the input of sets, a positive integer K (≤2000) is given, followed by K lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to N). All the numbers in a line are separated by a space.

Output Specification:

For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place.

Sample Input:

3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3

Sample Output:

50.0%
33.3%

样例解释:给定n个序列,K次查询

集合1和2;不同元素个数=4(99 87 101 5),集合1和2公共元素个数=2(87 101互不相同) 2/4=0.5

集合1和3;不同元素个数=6(99 87 101 18 5 135),集合1和2公共元素个数=2(99 101互不相同) 2/6=0.33

思路:在输入的时候就对每个集合去重(用unordered_set),

#include <cstdio>
#include <vector>
#include <set>
#include<unordered_set>
using namespace std;
int main() {
    int n, m, k, temp, a, b;
    scanf("%d", &n);
    vector<unordered_set<int>> v(n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &m);
        unordered_set<int> s;
        for(int j = 0; j < m; j++) {
            scanf("%d", &temp);
            s.insert(temp);
        }
        v[i] = s;
    }
    scanf("%d", &k);
    for(int i = 0; i < k; i++) {
        scanf("%d %d", &a, &b);
        int nc = 0, nt = v[b-1].size();
        for(auto it = v[a-1].begin(); it != v[a-1].end(); it++) {
            if(v[b-1].find(*it) == v[b-1].end())
                nt++;
            else
                nc++;
        }
        double ans = (double)nc / nt * 100;
        printf("%.1f%%\n", ans);
    }
    return 0;
}

 

1060 Are They Equal (25分)

If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered equal since they are both saved as 0.123×10^​5 ​​with simple chopping. Now given the number of significant digits on a machine and two float numbers, you are supposed to tell if they are treated equal in that machine.

Input Specification:

Each input file contains one test case which gives three numbers N, A and B, where N (<100) is the number of significant digits, and A and B are the two float numbers to be compared.

Each float number is non-negative, no greater than 10​100​​, and that its total digit number is less than 100.

Output Specification:

For each test case,

print in a line YES if the two numbers are treated equal, and then the number in the standard

form 0.d[1]...d[N]*10^k (d[1]>0 unless the number is 0); or NO if they are not treated equal,

and then the two numbers in their standard form. All the terms must be separated by a space, with no extra space at the end of a line.                Note:Simple chopping is assumed without rounding.

Sample Input 1:

3 12300 12358.9

Sample Output 1:

YES 0.123*10^5

Sample Input 2:

3 120 128

Sample Output 2:

NO 0.120*10^3 0.128*10^3

样例解释:两个数字(string)转化为科学计数法表示,保留n位小数,是否相等,(不用四舍五入)

思路:对于这两个数字,只需要求出他们的小数点后n位x,以及指数e,

对于 0.a1a2a3...am型数字,x为‘.’后第一个非0数字往后数n位的数字,(不够补0),e为第一个非0数字所在位置-1;

对于b1b2b3...bm.a1a2a3...ak型数字,x为第一个数字往后数n位的数字),e为m;

4 0000 0000.00
4 00123.5678 00001235
3 0.0520 0.0521
4 00000.000000123 0.000000123 
4 000100.000012 100.000012   YES 0.1000*10^3 

会有上面的一些情况,所以string要先去除所有的前导0,

然后,若第一位是'.'  则用solve1处理(0.a1a2型),否则用solve2处理(b1b2b3...bm.a1a2a3...ak型)

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<unordered_set>
#include<map>
#include<cmath>
#define pb push_back 
using namespace std;
int n;
string a,b,ans;
void solve1(string str,int &e){ //0.r1r2...rn*10^e 求 r1r2...rn e
	str.erase(str.begin());
	ans.clear();
	int len=str.length(),num=0;
	int i=0;
	while(str[i]=='0' && i<len)i++; //0.000123
	if(i<len){
		e=-i;
	}else{
		e=0;
	}
	while(i<len && num<n){
		ans+=str[i];
		i++;
		num++;
	}
	while(num<n) {ans+='0';num++;}	
}
void solve2(string str,int &e){
	int len=str.length(),i=0,j=0,num=0;
	ans.clear();
	while(j<len && str[j]!='.') j++;
	e=j;
	while(i<len && num<n){
		if(str[i]=='.') i++;
		else{
			ans+=str[i];
			num++;
			i++;
		}
	}
	while(num<n) {ans+='0'; num++;}	
}

int main(){ 
	cin>>n>>a>>b;
	int e1=0,e2=0;
	while(a.length() >  0 && a[0] == '0'){// delete 前导零
        a.erase(a.begin());
    }
    while(b.length() >  0 && b[0] == '0'){
        b.erase(b.begin());
    }
	if(a[0]=='.'){
		solve1(a,e1);
	}else{
		solve2(a,e1);
	}
	string ansa=ans; 
	if(b[0]=='.'){
		solve1(b,e2);
	}else{
		solve2(b,e2);
	} 
	string ansb=ans; 
	if(e1!=e2 || ansa!=ansb){
		cout<<"NO "<<"0."<<ansa<<"*10^"<<e1<<' '<<"0."<<ansb<<"*10^"<<e2<<'\n';
	}else{
		cout<<"YES "<<"0."<<ansa<<"*10^"<<e1;
	}
	return 0;
}

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值