第一次参加蓝桥杯,特发此文记录一下今天乱七八糟的做题状态。
#include<bits/stdc++.h>
using namespace std;
int arr[105]{0};
int yuefen[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int yueshu=0;
int ans[13][32]{0};
int main()
{
for(int i=0;i<100;++i)
cin>>arr[i];
for(int i=0;i<100;++i)cout<<arr[i]<<' ';cout<<endl;
//long long sum=0;
for(int a=0;a<100;++a)
if(arr[a]==2)
for(int b=a+1;b<100;++b)
if(arr[b]==0)
for(int c=b+1;c<100;++c)
if(arr[c]==2)
for(int d=c+1;d<100;++d)
if(arr[d]==3)
{
for(int yue1=d+1;yue1<100;yue1++)
if(arr[yue1]<=1)
for(int yue2=yue1+1;yue2<=100;++yue2)
if(arr[yue1]==0||(arr[yue1]==1&&arr[yue2]<=2))
{
yueshu++;
int yue=arr[yue1]*10+arr[yue2];
for(int ri1=yue2+1;ri1<100;++ri1)
if(arr[ri1]<=3)
for(int ri2=ri1+1;ri2<100;++ri2)
{
int ri=arr[ri1]*10+arr[ri2];
//cout<<yue<<' '<<ri<<endl;
if(ri<=yuefen[yue]&&yue!=0&&ri!=0)ans[yue][ri]=1,cout<<yue<<' '<<ri<<endl;
}
}
}
long long sum=0;
for(int i=0;i<13;++i)
for(int j=0;j<32;++j)
if(ans[i][j])sum++;
cout<<sum;
return 0;
}
/*
5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2
7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1
0 0 9 4 8 0 9 1 2 8 5 0 2 5 3 3
*/

一开始没有啥想法,甚至看这个定义都一头雾水,后面对着S=100这个解释才慢慢明白这个奇怪的式子每一位都要求一遍,后面全部加起来,而且这个通项和位置没有关系,那我们就直接上二分!这个时候我还没有看到“0”的个数比“1”的小,经过后面的计算才发现。就准备开始写了,有发现有点怪,不一定是单调的,得证明,才5分的题目也这么难?后面开摆了直接暴力算了👀。
这里一开始代码二分没有考虑这个不一定是个单调的区间,吓死个人,后面疯狂调试发现了应该是一个对称的函数,关于x=(0+23333333)/2对称的函数。然后就是公式代入计算就好了👀
#include<bits/stdc++.h>
using namespace std;
int weishu=23333333;
bool check(int n)
{
int n0=n;
int n1=weishu-n0;
double zhanbi1=n1*1.0/weishu;
double zhanbi0=n0*1.0/weishu;
double ans=-n0*zhanbi0*std::log2(zhanbi0)-n1*zhanbi1*std::log2(zhanbi1);
if(abs(ans-11625907.5798)<0.0001)
printf("%.7f %d\n",ans,n);
//return true;
//cout<<ans<<endl;
return false;
}
int main()
{
/*int left=0,right=23333333;
while(left<right)
{
int mid=left+(right-left)/2;
if(check(mid))right=mid;
else left=mid+1;
}*/
for(int i=0;i<23333333;++i)
if(check(i))cout<<i<<endl;
//cout<<std::log2(8);
//check(1);
//check(1217805);
return 0;
}
/*
1217804
1217805
*/
前面做的有时间有点长了,这个时候就有点着急,这道题目我一看就觉得应该是找 A/B 然后确定最大最小值就好(因为样例第一第二行就直接算出来答案了)我也不知道自己想的,反正就直接写了,写完之后才发现不对啊,最后的一行 59/2=29 ,然后才重新回过头来看这道题,这代应该是说找出一个数 X 使得每一个 A/X 向下取整都能得到 B的值,也没啥好思路,直接二分法(又是二分?不对上一道题我没有用二分)。这里分别对左右边界进行二分求解就好了。
这里我真的想给自己两巴掌,二分的是转换率V,然后限制条件那里的“if((b[i]+1)*(n)<a[i])return false;”我写成了:“if(b[i]*(n+1)<a[i])return false;”,完了debug半个小时,悲,好在后面看到了。
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
typedef long long LL;
LL a[N],b[N];
bool check(int n) //右边
{
for(int i=0;i<n;++i)
{
if(b[i]*n>a[i])return true;
if((b[i]+1)*n<a[i])return false;
if((b[i]+1)*n==a[i])return false;
//cout<<i<<' '<<a[i]<<' '<<b[i]<<endl;
}
return false;
}
bool check2(int n) //左边
{
for(int i=0;i<n;++i)
{
if(b[i]*n>a[i])return true;
if((b[i]+1)*(n)<a[i])return false;
if((b[i]+1)*(n)==a[i])return false;
}
return true;
}
int main()
{
//cout<<std::log2(1000000000);
int n;
cin>>n;
LL maxzhi,minzhi;
int l,r;
for(int i=0;i<n;++i)
{
cin>>a[i]>>b[i];
}
int left=0,right=(int)1e9;
while(left<right)
{
int mid=left+(right-left)/2;
if(check(mid))right=mid;
else left=mid+1;
}
maxzhi=left-1;
left=0,right=(int)1e9;
while(left<right)
{
int mid=left+(right-left)/2;
if(check2(mid))right=mid;
else left=mid+1;
}
minzhi=left;
cout<<minzhi<<" "<<maxzhi;
return 0;
}
/*
3
75 3
53 2
59 2
*/
这道题我的想法是把到达时间和天上滞留时间加在一起作为一个整体,得到一个最晚起飞的时间,然后对每一个指标按顺序进行稳定排序,首先是最晚起飞时间,然后到到达时间、然后是降落时间,最后按顺序进行模拟,如果轮到一架飞机的降落时间超过它的对应最晚降落时间,那么就直接输出“NO”(区分大小写!),如果顺利模拟那就说明能够全部降落,输出“YES”。
写太快了,最后五分钟发现没有稳定排序到达时间还有降落时间,希望能骗到一点分。
#include<bits/stdc++.h>
using namespace std;
const int N = 100;
typedef long long LL;
int t[N],d[N],l[N];
int main()
{
int k;
cin>>k;
while(k--)
{
int n;
cin>>n;
LL time=0;
bool biaoji=0;
for(int i=0;i<n;++i)
cin>>t[i]>>d[i]>>l[i];
for(int i=0;i<n;++i)
for(int j=0;j<n-i-1;++j)
{
if(t[j]+d[j]>t[j+1]+d[j+1])
{
swap(t[j],t[j+1]);
swap(d[j],d[j+1]);
swap(l[j],l[j+1]);
}
}
for(int i=0;i<n;++i)
{
if(time>t[i]+d[i])
{
biaoji=1;
cout<<"NO\n";
break;
}
time=max((int)time,t[i]);
time+=l[i];
}
if(biaoji)continue;
else cout<<"YES\n";
}
return 0;
}
/*
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20
*/
部分答案正确
这道题目要求的是最少从中删除多少个数,而且没有询问我们是删除哪些数字,那就可以把问题转换为这个数列中最多有多少个接龙子序列,对于每一个数字我们也可以抽象成开头数字还有结尾数字,分别使用两个数组来存储就好,再来一个数组记录取到这一个整数最多能有多少个接力哦那个数列,然后从前往后一位一位枚举就好。
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
typedef long long LL;
int a[N],b[N],dp[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;++i)
{
int shuru;
cin>>shuru;
b[i]=shuru%10;
while(shuru>10)shuru/=10;
a[i]=shuru;
}
int maxzhi=0;
for(int i=0;i<n;++i)
{
dp[i]=1;
for(int j=0;j<i;++j)
{
if(b[j]==a[i])dp[i]=max(dp[i],dp[j]+1);
}
maxzhi=max(maxzhi,dp[i]);
}
cout<<n-maxzhi;
return 0;
}
/*
5
11 121 22 12 2023
*/
超时了应该
3
这道题应该是用bfs来做,但是只是浅浅一眼就润了,后面没有时间补了,悲,主要bfs不熟练,不太想花时间
这道题直接暴力肯定是不太行的感觉,5×10^5 应该是会炸的,这里我把目标的字符抽离出来只简单记录好在原来的字符串中的位置,分别用两个数组来存储,然后对 a 的位置一个一个从前往后进行查找,我们的目标是找每一个 a 往后数 k-1 个位置之后有多少个 b 出现,所以简单while对比一下就好,由于我们已经把 a 还有 b 抽离出来存储位置,所以我们能够直接定位到 b 的位置的同时,也能够快速查询到后面还剩下多少个 b 。
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
typedef long long LL;
int a[N],b[N];
int main()
{
int k;
cin>>k;
string s;
char aa,bb;
cin>>s;
scanf(" %c %c",&aa,&bb);
//cout<<s;
//printf(" %c %c",aa,bb);
int len=s.size();
int zhizhena=0,zhizhenb=0;
for(int i=0;i<len;++i)
{
if(s[i]==aa)a[zhizhena++]=i;
if(s[i]==bb)b[zhizhenb++]=i;
}
LL sum=0;
for(int i=0;i<zhizhena;++i)
{
int weizhi=0;
while(b[weizhi]-a[i]<k-1&&weizhi<zhizhenb)weizhi++;
if(b[weizhi]-a[i]>=k-1)sum+=zhizhenb-weizhi;
}
cout<<sum;
return 0;
}
/*
4
abababdb a b
*/
大部分能过
一边查找一边删除,直接链表,但是忘记开long long
这个忘记拷下来了👀
-后面两题不会了-
总结一下这一次的比赛,时间的安排上感觉有点急促,主要时间都花在一些奇怪问题的debug上面的了,早上好早就起来了,但是开始比赛的时候人还是不太清醒,看到第二题的时候吓到我了(因为没有用过 log2 这个函数,心里咯噔一下)后面在帮助文档上面找到了,然后就是第三题花的时间有点多,感觉一直没有进入状态,后面到了E题才慢慢进入状态。这一次比赛题目填空题偏难,隔壁 Java 的听说是一道求连续的阶乘和,从 1 加到202320232023好像是,求最后的 9 位,这不是一下子就又答案了嘛,为啥我们的题目这么多坑咧,大题整体上应该还行吧希望球球了,没有省一赏一个省二也行啊(不是)。
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e
什么是测试格式验证的最佳方法让我们说一个用户名,使用字母数字的正则表达式,但不是纯数字?我一直在我的模型中使用以下验证validates:username,:format=>{:with=>/^[a-z0-9]+[-a-z0-9]*[a-z0-9]+$/i}数字用户名(例如“342”)通过了验证,这是我不想要的。 最佳答案 您想“向前看”一封信:/\A(?=.*[a-z])[a-z\d]+\Z/i 关于ruby-on-rails-Rails格式验证——字母数字,但不是纯数字,我们在Sta
我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.
我发现ruby加载路径是一个数组,很多项目都是这样使用的:$:.unshift(File.expand_path("../../lib",__FILE__))可以将本地文件添加到ruby路径数组的前面,方便我们require或者load。所以,我希望知道为什么我们不使用push将文件添加到数组的末尾? 最佳答案 假设您有一个“date.rb”文件(为什么不呢)并且您想要加载这个文件,而不是标准库日期。如果您使用追加,当您调用require'date'时您的文件将永远不会被加载,因为它位于数组的末尾并且标准日期会在之前找到。因此,如果
我有一个这样的哈希{55=>{:value=>61,:rating=>-147},89=>{:value=>72,:rating=>-175},78=>{:value=>64,:rating=>-155},84=>{:value=>90,:rating=>-220},95=>{:value=>39,:rating=>-92},46=>{:value=>97,:rating=>-237},52=>{:value=>73,:rating=>-177},64=>{:value=>69,:rating=>-167},86=>{:value=>68,:rating=>-165},53=>{:va
我在这里对我的部署策略有点困惑,在什么情况下部署时我想向unicorn发送reload信号?例如在我的例子中它会是这样的:sudokill-sUSR2`cat/home/deploy/apps/my_app/current/tmp/pids/unicorn.pid`我一直在通过杀死那个pid来部署我的应用程序,然后通过类似的东西再次启动unicorn:bundleexecunicorn-cconfig/unicorn/production.rb-Eproduction-D我只是想知道为什么要使用重新加载?我可以通过这样做获得部署的任何性能吗? 最佳答案
使用FileUtils方法有什么好处http://ruby-doc.org/core/classes/FileUtils.html比等效的Bash命令? 最佳答案 除此之外,您不必担心确保您的目标平台安装了您正在使用的特定工具这一事实,以及正确引用shell异常的问题(如果您的目标是特别有问题的)Windows和Unix-alikes——尽管有Cygwin、GNUWin32等),如果你使用Ruby的FileUtils,你有一个Ruby函数调用的中等大小的开销,而如果你使用外部实用程序,你有相当大的开销来启动一个外部进程的每一次“调用