7-11 集合相似度
题解:
主要就是用set
在查找一个数是否属于set数组之中时可以用find函数查找而不一定非要重新建一个set数组输入进去
之前一直超时现在改用find就不超时了
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
set<int> s[n+1];
for(int i=1;i<=n;i++)
{
int k;
cin>>k;
while(k--)
{
int t;
cin>>t;
s[i].insert(t);
}
}
int m;
cin>>m;
while(m--)
{
int a,b;
cin>>a>>b;
int a1=s[a].size();
int a2=s[b].size();
int count=0;
for(auto it=s[a].begin();it!=s[a].end();it++)
{
if(s[b].find(*it)!=s[b].end())
{
count++;
}
}
printf("%.2lf%\n",count*100.0/(a1+a2-count));
}
}
7-12 列车调度
题解:
用set里面的upper_bound(x)函数
可以具体看大佬的博客
lower_bound与upper_bound()用法笔记
STL——upper_bound && lower_bound
lower_bound和upper_bound是C++ STL中提供的函数
操作对象可以是vector、set以及map
upper_bound(i):返回map中第一个大于key的迭代器指针
lower_bound(i):返回map中第一个大于或等于key的迭代器指针
在set中使用
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int>s;
set<int>::iterator it1,it2,it;
for(int i=1;i<10;++i) s.insert(i);
it1=s.lower_bound(3);
it2=s.upper_bound(6);
cout<<*(it1)<<" "<<*(it2)<<endl;
//由于set中没有像vector中那样排序的概念,因此itlow - myset.begin()是错误的
s.erase(it1,it2);// 删除区间内的元素,区间左闭右开
for(it=s.begin();it!=s.end();++it)
cout<<*it<<" ";
cout<<endl;
return 0;
}
这里用的是upper_bound
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x;
cin>>n;
set<int>S;
for(int i=0,x;i<n;i++)
{
cin>>x;
auto X=S.upper_bound(x);
S.insert(x);
if(X!=S.end())S.erase(X);
}
cout<<S.size();
return 0;
}
7-5 整除光棍
题解:
这是关于大数的一个问题
可以用java里面的大数类做
Java高新技术——大数操作(BigInteger、BigDecimal)
package ustc.lichunchun.bigdataapi;
import java.math.BigInteger;
public class BigIntegerDemo1 {
public static void main(String[] args) {
BigInteger bi1 = new BigInteger("123456789") ; // 声明BigInteger对象
BigInteger bi2 = new BigInteger("987654321") ; // 声明BigInteger对象
System.out.println("加法操作:" + bi2.add(bi1)) ; // 加法操作
System.out.println("减法操作:" + bi2.subtract(bi1)) ; // 减法操作
System.out.println("乘法操作:" + bi2.multiply(bi1)) ; // 乘法操作
System.out.println("除法操作:" + bi2.divide(bi1)) ; // 除法操作
System.out.println("最大数:" + bi2.max(bi1)) ; // 求出最大数
System.out.println("最小数:" + bi2.min(bi1)) ; // 求出最小数
BigInteger result[] = bi2.divideAndRemainder(bi1) ; // 求出余数的除法操作
System.out.println("商是:" + result[0] +
";余数是:" + result[1]) ;
}
}
用C++的话就是要用模拟除法
模拟除法,每次取一位商,余数加下一位,当商为0时,不保存
模拟除法的算法思想:
1=d1=q⋅x+r(0≤r<x),其中q为商r为余数
*11=d2=10⋅d1+1=10q⋅x+(10r+1),(0<10r+1<10x),*⋯,
所以高一位的商值若由上一步确定了,往后低位的上商都不会对其造成影响,因为每位的商最多为9.因此整数除法可自高位开始逐位确定商值.
#include <stdio.h>
int main()
{
char a[1000];//创建存表
int len=0,count=0;
int n;
int t=1;
scanf("%d",&n);
while(1)
{
count++;
if(len||t/n)//商第一位为0,不存入数组中
{
a[len]='0'+t/n;//把数字变为字符存储
len++;
}
t%=n;//取余数
if(t==0)//判断余数是否为零,余数为0结束
{
a[len]='\0';//输入数组终止符
printf("%s %d",a,count);
break;
}
t=t*10+1;
}
return 0;
}
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int main()
{
int x,i,n=0,flag=0;
cin>>x;
for(i=1;;i++)
{
n=n*10+1;
if(n>=x)
{
flag=1;
cout<<n/x;
}
else if(flag==1) cout<<0;
n=x%n;
if(n==0) break;
}
cout<<" "<<i<<endl;
return 0;
}