第一题用了text文本洗数据和excel
第二题用的判断素数和穷举 开始想象公差太小 没出来结果……代码附上
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
bool isPrime(int n){
if(n<=1)return false;
int sqr=(int)sqrt(n*1.0);
for(int i=2;i<=sqr;i++){
if(n%i==0)return false;
}
return true;
}
int main(){
for(int d=2;d<300;d++)
{
for(int i=2;i<100000;i++){
if(isPrime(i)&&isPrime(i+2*d)&&isPrime(i+3*d)&&isPrime(i+4*d)&&isPrime(i+5*d)&&isPrime(i+6*d)&&isPrime(i+7*d)&&isPrime(i+8*d)&&isPrime(i+9*d))
{
cout<<d;
break;
}
}
}
}
遇到的一个初始化可爱函数(名称模仿武忠祥老师定积分定义计算讲到的可爱因子,1/n和武老师简直太优秀) 这样就不担心0和数据0会撞了
C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
第六题说是动态规划……我的方法就是把自己想象成代码跑一圈能做出来
第七题废了老鼻子劲 介绍下面用到的几个好用的函数
swap()方便交换数据,省了temp,需要加头文件algorithm
printf("%02d-%02d-%02d\n",b[0],b[1],b[2]);
printf是个好东西啊 cin cout太不适合比赛了 上面的是要求限制整数输出两位少的补0
printf("%.2f",profit);之前用过是保留两位小数
pre_permutation();用do{}whitle();会输出全排列 开始理解错题意就用了这个……至今记不住permutation这个单词……哭了 考咋办 需要加头文件algorithm
看别人用了栈和队列啥的……我就算了 可能是洗数据洗多了 只会留下有用的……
一直想用三个string 拼接 我可能总在做梦……改天再实现吧我们下一题
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[6];
int b[3];
int m=0,n=0;
for(int i=0;i<8;i++){
int c=getchar();
if(c=='/')continue;
a[m]=c-48;
m++;
}
for(int i=0;i<3;i++){
b[i]=a[n]*10+a[n+1];
n+=2;
}
int i=1;
while(i<=3)
{
if(i==2)
{
swap(b[0],b[2]);
swap(b[1],b[2]);
}
else if(i==3)
{
swap(b[1],b[2]);
}
int m=b[0]*10000+b[1]*100+b[2];
if(m>=600101)
{
printf("19%02d-%02d-%02d\n",b[0],b[1],b[2]);
}
if(m<=591231)
{
printf("20%02d-%02d-%02d\n",b[0],b[1],b[2]);
}
i++;
}
return 0;
}
第九题是个二分 我不是很熟 参考一下答案 带那么多头文件老哥真的吓死我了都 然后删除了也可以编译……没用的话就别加了呗怪恐怖
换了一个别人的,一会儿等学完了背包再自己写写:
#include<iostream>
#include<algorithm>
using namespace std;
int n,k,h[100010],w[100010];
bool solve(int mid) // 传递参数:最大快数mid
{
int res=0,a,b,i;
for(i=0;i<n;i++)
{
a=h[i]/mid;//划分长比如说6/2
b=w[i]/mid;//划分长比如说5/2
res+=a*b;//长可以划分的最大,宽可以划分的最大的成绩就是整体的块数
}
if(res>=k)
return true;
return false;
}
int main()
{
int i,low,high;
while(scanf("%d%d",&n,&k)!=EOF)
{
low=1;
high=10000;
for(i=0;i<n;i++)
scanf("%d%d",&h[i],&w[i]);
while(low<high-1)
{
int mid=(low+high)/2;
if(!solve(mid))
high=mid;
else
low=mid;
}//二分法确定mid的值,对1-10000区间二分确定范围
printf("%d\n",low);
}
return 0;
}
第十题的思想是前缀和思想……这个起名我真不想说啥……就……前缀我就想到被二叉树支配的恐惧就觉得很难
查了之后我简单解释下:倒不如说成叠加和,类似小时候玩的摆火车,我的筹码是我身后的全部,就是一2,6,7,9,13……这种序列,如果你想求某个[n,m]区间所有数列的和,那我们直接先从头求到尾,上面数列变成2,8,15,24,37……要求上面7~13,我们直接用37-15就好 算法笔记有讲我翻不到了了,刚吃了两笼小笼包现在有杯玉米汁多的话真的太幸福了~
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int N;
int K;
int a[100010];
cin>>N;
cin>>K;
for(int i=0;i<N;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<N;i++){
a[i]=a[i]+a[i-1];
}
cout<<endl;
int count=0;
for(int i=0;i<N;i++){
if(a[i]%K==0)
{count++;}
for(int j=i+1;j<N;j++){
if((a[j]-a[i])%K==0)
{count++;}
}
}
cout<<count;
return 0;
}