题目:
幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的"筛法"生成。
首先从1开始写出自然数1,2,3,4,5,6,....
1 就是第一个幸运数。
我们从2这个数开始。把所有序号能被2整除的项删除,变为:
1 _ 3 _ 5 _ 7 _ 9 ....
把它们缩紧,重新记序,为:
1 3 5 7 9 .... 。这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去。注意,是序号位置,不是那个数本身能否被3整除!! 删除的应该是5,11, 17, ...
此时7为第3个幸运数,然后再删去序号位置能被7整除的(19,39,...)
最后剩下的序列类似:
1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, ...
要点总结:
只需要考虑所有小于等于n的数就可以,先全压进去,然后按照题目的要求去模拟,直到步长直接超过size就不用操作了。这里加一减一的坐标看一下特殊情况。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
vector<int> lucky;
for(int i=1;i<=n;i=i+2){
lucky.push_back(i);
}
for(int i=1;i<lucky.size();i++){
int step=lucky[i];
if(step>lucky.size()){
break;
}
vector<int> newl;
for (int i = 0; i < lucky.size(); ++i) {
if ((i + 1) % step != 0) {
newl.push_back(lucky[i]);
}
}
lucky=newl;
}
int count = 0;
for (int num : lucky) {
if (num > m && num < n) {
count++;
}
if (num >= n) {
break;
}
}
cout<<count;
return 0;
}
题目:
三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻。第二个农民在700时刻开始,在 1200时刻结束。第三个农民在1500时刻开始2100时刻结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300时刻到1200时刻),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200时刻到1500时刻)。 你的任务是编一个程序,读入一个有N个农民(1 <= N <= 5000)挤N头牛的工作时间列表,计算以下两点(均以秒为单位): 最长至少有一人在挤奶的时间段。 最长的无人挤奶的时间段。
要点总结:
将所有时间按起始早的排序,起始相同的话按结束早的排序,然后遍历所有时间,创造新的merge数组,和前一个有重叠的话直接修改前一个的结束时间即可,没有重合就插入新的。最后遍历merge来判断有人的和没人的时间。
代码:
#include<bits/stdc++.h>
using namespace std;
struct Time{
int start;
int end;
};
bool compa(Time a,Time b){
if(a.start!=b.start){
return a.start<b.start;
}
return a.end<b.end;
};
int main(){
int n;
cin>>n;
vector<Time> arr;
for(int i=0;i<n;i++){
Time a;
cin>>a.start>>a.end;
arr.push_back(a);
}
sort(arr.begin(),arr.end(),compa);
vector<Time> merge;
merge.push_back(arr[0]);
int end=arr[0].end;
for(int i=1;i<n;i++){
if(arr[i].start>end){
merge.push_back(arr[i]);
}else{
if(arr[i].end>merge.back().end){
merge.back().end=arr[i].end;
}
}
}
int youren=0,wuren=0;
for(int i=0;i<merge.size();i++){
if(merge[i].end-merge[i].start>youren){
youren=merge[i].end-merge[i].start;
}
}
for(int i=1;i<merge.size();i++){
if(merge[i].start-merge[i-1].end>wuren){
wuren=merge[i].start-merge[i-1].end;
}
}
cout<<youren<<" "<<wuren;
return 0;
}
题目:
写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。
如果小数有循环节的话,把循环节放在一对圆括号中。
例如, 1/3 = .33333333 写成0.(3)
41/333 = 0.123123123... 写成0.(123)
用xxx.0 表示整数
典型的转化例子: 1/3 = 0.(3)
22/5 = 4.4
1/7 = 0.(142857)
2/2 = 1.0
3/8 = 0.375
45/56 = 0.803(571428)
要点总结:
先算一下整数部分,余下的部分拿来算小数。如果同样的remain出现过了,那么repeat开始的地方就用map取出,此时可以直接break因为循环部分已经全输入了。没有出现过的话记录一下(用map,记录remain的值和第一次出现的下标)。另外将remain乘10再去除d得到这位小数,取余d得到更新的remain。最后输出的时候不要setw了,直接for里面用个count记录,到次数了就换行。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,d;
cin>>n>>d;
int zhen=n/d;
int remain=n%d;
int repeatstart=-1;
map<int,int> remain_idx;
vector<int> xiaoshu;
while(remain>0){
if(remain_idx.find(remain)!=remain_idx.end()){
repeatstart=remain_idx[remain];
break;
}
remain_idx[remain]=xiaoshu.size();
int cur=remain*10/d;
xiaoshu.push_back(cur);
remain=remain*10%d;
}
string res=to_string(zhen)+".";
if(xiaoshu.size()==0){
res=res+"0";
}else{
if(repeatstart==-1){
for(int c : xiaoshu){
res=res+to_string(c);
}
}else{
for(int i=0;i<repeatstart;i++){
res=res+to_string(xiaoshu[i]);
}
res+="(";
for(int i=repeatstart;i<xiaoshu.size();i++){
res=res+to_string(xiaoshu[i]);
}
res+=")";
}
}
int count=0;
for(int i=0;i<res.size();i++){
cout<<res[i];
count++;
if(count%76==0){
cout<<endl;
count=0;
}
}
return 0;
}
英语翻译:
量子人工智能将量子计算与人工智能结合起来以解决复杂的问题。量子算法可以加速对经典计算机来说棘手的训练以及优化过程。即使该领域目前任处于早期,其对于提升人工智能的能力具有巨大潜力。
人工智能驱动的推荐系统会分析用户数据来提供个性化内容。电商平台使用这些系统来推荐产品,流媒体服务
用这些系统来推荐电影音乐。这种个性化服务提升了用户参与度,但也带来了人们对于数据隐私的担忧。
人工智能在灾难相应领域的应用可以处理卫星和无人机图像来快速评估灾情。机器学习技术可以识别受影响的地区以及弱势人群,进而帮助救援组织高效分配资源。这种技术在紧急情况中节约了宝贵的时间。
quantum量子
intractable棘手的