寒假学习

训练第一周试题A:
首先是说任意x;所以x取一,比较好计算,就是(18+ka)%65==0,成立;
也就是a
k+18=65b;是一个二元一次方程,上网搜后查到,二元一次方程有正数解的充要条件是c%gcd(k,65)==0;ax+by=c;也就是a有正解为c%gcd(x,b)==0;这样就好做多了。gcd之前用过,是求最大公约数的。
链接https://blog.csdn.net/Zctoylm/article/details/77017897
2321:
输入一个自然数N 
请写一个程序来增序输出分母小于等于N的既约真分数
Input单独的一行 一个自然数N(1…160)Output每个分数单独占一行Sample Input5Sample Output0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
这个题就是将分数由小到大排列,而且分数一样的要数小的例如(1/2和2/4一样,要1/2),所以就要满足分子分母的最大公约数为1,然后就是比较分数的大小,可以这样找,就是分数小的分子乘以分数大的分母小于分数大的分子乘以分数小的分母,也就是(1/3和2/5:1
5<2*3)所以1/5小,就这样排序,也可以用sort函数,不过这样就要用结构体。
搜的链接https://blog.csdn.net/sundujing/article/details/46927275
我的代码;
#include
#include<stdio.h>
#include
using namespace std;
int n[20000],m[20000];
void sort(int a)
{
int i,t,j;
for(i=0;i<a-1;i++)
{
for(j=i+1;j<a;j++)
if(n[i]*m[j]>m[i]n[j])
{
t=n[i];
n[i]=n[j];
n[j]=t;
t=m[i];
m[i]=m[j];
m[j]=t;
}
}}
int gcd(int a,int b){ return b==0 ? a:gcd(b,a%b);}
int main()
{
int a,j,i,k=0;
scanf("%d",&a);
for(i=1;i<=a;i++)
for(j=i+1;j<=a;j++)
{
if(gcd(i,j)==1)
{
n[k]=i;
m[k]=j;
k++;
}
}
sort(k);
printf(“0/1\n”);
for(i=0;i<k;i++)
printf("%d/%d\n",n[i],m[i]);
printf(“1/1\n”);
return 0;
}明显和别人的有差距,还是垃圾。
训练赛B题:
链接:https://blog.csdn.net/qq_41593380/article/details/86435983;
解题主要是要将数一样的归一起而且还不可以打乱,就用一个二维数组,就是像代码中的a[k][b[k]]=i,这样就很好的将数一样的分在了一起并且没有打乱顺序,之后再输出时也没影响。还有就是对题目的理解以及判断。
训练赛G题:
链接:http://acm.sdibt.edu.cn/vjudge/contest/view.action?cid=2157#overview;
这个题就是顺时针逆时针不知道什么时候执行,所以就用迭代将所有情况都试一遍只要出现了对的,就return,所以就做出来,但是这只适用于数小的,如果数太大那么情况就会多出许多,就不可以用这种方法。
排序方法:
1):冒泡法:就是将一个数和它后面的数比较,比他大就换否则不换。时间复杂度O(n^2).
2)选择法;就是找出最大的排在首位。时间复杂度O(n^2);
3)插入法,是先固定前面的不懂让后一个往前找,找到比他小的就放他后面,和插扑克牌类似。时间复杂度,如果都需要排就是O(n^2),如果都不需要O(n),也就是说他的时间复杂度看序列的混乱程度,所以比前两个方法好一点。
重点:时间复杂度都是o(n
log n);
4):归并法:就是用递归进行排序,具体看代码。空间复杂度O(N)
#include
#include<stdio.h>
using namespace std;
int a[8];
void H(int b,int m,int c)
{
int i=0,n1,n2,d,n[c-b+1]
n1=b;
n2=m+1;
while(n1<=m&&n2<=c)
{
n[i++]=a[n1]<a[n2]?a[n1++]:a[n2++];//过程大致是将两边的依次取比较小的,并且取完小的后让它往后移一位再和另一边比。
}//肯定会有一个且只有一个会越界;
while(n1<=m)
{
n[i++]=a[n1++];
}
while(n2<=c)
{ n[i++]=a[n2++];
}//保证将越界的也输入进去;
for(i=0;i<c-b+1;i++)
{
a[b+i]=n[i];//有b+i是因为传过来的数组不是从0开始的.
}
}
void f(int b,int c)
{
int m;
if(b==c)
{ return ; }
m=b+(c-b)/2;//类似二分将大的化为小的排好序;
f(b,m);
f(m+1,c);
H(b,m,c);
}
int main()
{
int i;
for(i=0;i<8;i++)
scanf("%d",&a[i]);
f(0,i-1);
for(i=0;i<7;i++)
printf("%d “,a[i]);
printf(”%d",a[i]);
return 0;}
5):
6):
kaixuexue:
erfen f:https://blog.csdn.net/KJBU2/article/details/36898903

猜你喜欢

转载自blog.csdn.net/weixin_43731005/article/details/86514446