P5735 【深基7.例1】距离函数
题解:
给三点坐标,然后求出三点连接成的三角形的周长,也就是求这三条线每两条线之间的距离的和,数学题,直接计算即可。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double juli(double a,double b,double c,double d){
double dis;
dis=sqrt(pow(a-c,2)+pow(b-d,2));
return dis;
}
int main(void){
double x1,x2,x3,y1,y2,y3,sum;
cin>>x1>>y1;
cin>>x2>>y2;
cin>>x3>>y3;
sum=juli(x1,y1,x2,y2)+juli(x2,y2,x3,y3)+juli(x3,y3,x1,y1);
cout<<fixed<<setprecision(2)<<sum;
}
P5736 【深基7.例2】质数筛
题解:
就是找出一列数中的质数。质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。就是如果遇到除了1和本身外还有能整除的数那就不是质数,根据这个规律从2开始遍历到自身即可。
我用的是稍微少一点时间复杂度的方法,一个数对于另一个的数的开方不能整除,则这一个数对另一个数本身也无法做到整除,减少了一半的时间复杂度。
其实质数筛还可以用另外一个更高级的欧拉筛法,通过公倍数来整除,想了解的可以自己搜索一下。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
bool zhishu(int x){
if(x==1||x==0)return false;
for(int i=2;i<=sqrt(x);i++){
if(x%i==0)return false;
}return true;
}
int main(void){
int n;
cin>>n;
int arr[105];
for(int i=0;i<n;i++){
cin>>arr[i];
if(zhishu(arr[i])){
cout<<arr[i]<<" ";
}
}
return 0;
}
P5737 【深基7.例3】闰年展示
题解:
用函数判断闰年,就是知道闰年判断方法即可;
普通年份:如果年份能被4整除但不能被100整除,则是闰年。例如,2004年是闰年,而1900年不是闰年。
世纪年份:如果年份是整百数,它必须能被400整除才是闰年。例如,2000年是闰年,但2100年不是闰年。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
bool run(int k){
if(k%4==0&&k%100!=0||k%400==0){
return true;
}
else{
return false;
}
}
int main(void){
int x,y,s=0;
int a[3001]={0};
cin>>x>>y;
for(int i=x;i<=y;i++){
if(run(i)){
s++;
a[i]++;
}
}
cout<<s<<endl;
int f=0;
for(int j=1582;j<=3000;j++){
if(a[j]!=0){
f++;
if(f>1){
cout<<" ";
}
cout<<j;
}
}
}
P5738 【深基7.例4】歌唱比赛
题解:
这次代码写的比较详细,应该不用解释了,自己看就好了
代码如下:
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;
int main(void){
int n,m;//定义
double max=0;//首先把最大值设为int_min
cin>>n>>m;
for(int i=1;i<=n;i++){
double s[1000],sum=0;//临时数组记录本组内容
for(int j=1;j<=m;j++){ //循环输入评委的for循环
cin>>s[j]; //输入每个成绩
sum+=s[j]; //每次把成绩累计求和
}
sort(s+1,s+m+1);//调用sort进行排序,默认为升序。
sum=sum-s[1]-s[m];//找到最大最小值,减去最大值和最小值
sum/=(m-2);//注意平均分的时候要减去最大,最小值所以数量是m-2
if(sum>max)max=sum;//这里比较大小,sum大把sum赋给MAX
}
cout<<fixed<<setprecision(2)<<max;//保留两位小数,输出结果
return 0;//结束
}
P5739 【深基7.例7】计算阶乘
题解:
高中数学,知道阶乘怎么求就可以了。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int jie(int x){
if(x==1){
return 1;
}
else{
return ((jie(x-1))*x);
}
}
int main(){
int n;
cin>>n;
int jie(int x);
cout<<jie(n);
}
P5461 赦免战俘
这道题主要考的是找规律,就跟小学奥数题一样。
我们可以列出几种情况下的矩阵,逐一对比,总结规律。
首先发现将第一行只有最后一个是1,然后后面每一行,如果i行j列的上一行i-1行j列加上i-1行j+1列的和为1时候,i行j列也为1,如果和为2或0时候,i行j列相应的数为0,按照这个规律一步步遍历即可。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
int arr[1025][1025];
using namespace std;
int main(void){
int n;
cin>>n;
for(int k=0;k<pow(2,n);k++){
if(k==(pow(2,n))-1){
arr[0][k]=1;
} else{
arr[0][k]=0;
}
}
for(int i=1;i<pow(2,n);i++){
for(int j=0;j<pow(2,n);j++){
if(arr[i-1][j]+arr[i-1][j+1]==1){
arr[i][j]=1;
}
if(arr[i-1][j]+arr[i-1][j+1]==2||arr[i-1][j]+arr[i-1][j+1]==0){
arr[i][j]=0;
}
}
}
for(int i=0;i<pow(2,n);i++){
for(int j=0;j<pow(2,n);j++){
if(j>0){
cout<<" ";
}
cout<<arr[i][j];
if(j==(pow(2,n))-1){
cout<<endl;
}
}
}
return 0;
}
P5740 【深基7.例9】最厉害的学生
这个题其实可以用结构体,但鉴于大家还没学到可能,就开了五个数组来分别记录学生名字,第一科成绩,第二科成绩,第三科成绩,以及计算出来的总分。
我们直接读入,然后遍历,用一个值max去存储每一次,如果总分大于max,则max=总分,如果等于则不记录,因此,我们可以得到如果多个分数相同的情况下,第一次读到的最大分。
输出即可。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<string>
using namespace std;
string name[1001];
int sum[1001],r1[1001],r2[1001],r3[1001];
int zong(int a,int b,int c){
int s;
s=a+b+c;
return s;
}
int main(){
int n;
cin>>n;
int zong(int a,int b,int c);
for(int i=0;i<n;i++){
cin>>name[i]>>r1[i]>>r2[i]>>r3[i];
sum[i]=zong(r1[i],r2[i],r3[i]);
}
int max=sum[0],ans=0;
for(int j=0;j<n;j++){
if(sum[j]>max){
max=sum[j];
ans=j;
}
}
cout<<name[ans]<<" "<<r1[ans]<<" "<<r2[ans]<<" "<<r3[ans];
return 0;
}
P5741 【深基7.例10】旗鼓相当的对手 - 加强版
第一次看到这道题,大家可能会在思考怎么去用字典序排列,但是,其实不需要排序字典序,因为这道题已经说了它的给出的数据都是已经用字典序排列好的,所以我们可以直接遍历,然后发现符合“旗鼓相当的对手”的一组数据直接输出即可。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
string name[1005];
int a[1005],b[1005],c[1005];
int main(void){
int n,i;
cin>>n;
for(i=0;i<n;i++){
cin>>name[i]>>a[i]>>b[i]>>c[i];
}
for(int j=0;j<n-1;j++){
for(int k=j+1;k<n;k++){
if(a[j]-a[k]<=5&&a[j]-a[k]>=-5
&&b[j]-b[k]<=5&&b[j]-b[k]>=-5&&c[j]-c[k]<=5
&&c[j]-c[k]>=-5&&a[j]+b[j]+c[j]-a[k]-b[k]-c[k]<=10
&&a[j]+b[j]+c[j]-a[k]-b[k]-c[k]>=-10){
cout<<name[j]<<" "<<name[k]<<endl;
}
}
}
return 0;
}
P5742 【深基7.例11】评等级
很简单的一道题,计算比较,满足条件则输出优秀,不满足条件则输出不优秀。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
int a[1005],b[1005],c[1005];
bool youxiu(int x,int y){
if(x+y>140&&x*7+y*3>=800){
return true;
}else{
return false;
}
}
int main(void){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i]>>b[i]>>c[i];
}
bool youxiu(int x,int y);
for(int j=0;j<n;j++){
if(youxiu(b[j],c[j])){
cout<<"Excellent"<<endl;
}
else{
cout<<"Not excellent"<<endl;
}
}
return 0;
}
P1075 [NOIP2012 普及组] 质因数分解
找出最大的质因数,
因为数据范围达到2的九次方,数据范围很大,一个个慢慢循环去直接寻找最大质因数需要很长时间,占时间,容易,超时。
我们可以曲线救国,换个思路,数除以最小质因数=最大质因数。
也就是从2开始遍历,先找出最小的质因数,找到了就退出循环,n除以最小的质因数就能得到最大质因数了。
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n, i;
cin >> n;
for (i=2; i<=sqrt(n); ++i)
if (n % i == 0)
break;
cout << n / i << endl;
return 0;
}
P1304 哥德巴赫猜想
题目意思就是把大于2到n的所有偶数的质数之和给写出来,也就是循环遍历2到这个数,找到第一个数和第二个数都是质数的输出即可,注意第一个数必须为两个数较小的数,第二个数为两个数中较大的数。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
bool zhishu(int num){
for(int i=2,I=sqrt(num);i<=I;i++){
if(num%i==0)
return 0;
}
return 1;
}
int main()
{
int n;
cin>>n;
for(int i=2;i<n/2+1;i++){
cout<<i*2<<'=';
for(int j=2;j<i*2;j++){
if(zhishu(j)){
if(zhishu(i*2-j)){
cout<<j<<'+'<<i*2-j<<endl;
goto flag;
}
}
}
flag:;
}
}
P1217 [USACO1.5] 回文质数 Prime Palindromes
写两个函数
一个判断是否是质数的函数,从2遍历到数的开方,能整除则不是质数。
一个判断是否是回文数的函数,先把小于0和两位数和两位数以上,个位数为0这些肯定不是回文数的去掉。然后定义一个数res,把x取反,也就是把上一次的数*10+x%10,x/=10。最后判断如果res==x,则是回文数,如果res!=x,就不是回文数。
写出这两个函数即可。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
bool zhishu(long long z){
for(int q=2;q<=sqrt(z);q++){
if(z%q==0){
return false;
}
}
return true;
}
bool huiwen(long long x){
if(x<0||(x%10==0&&x!=0)){
return false;
}
long long oldRes=x;
long long res=0;
while(x!=0){
res=res*10+(x%10);
x/=10;
}
if(res==oldRes){
return true;
}
else{
return false;
}
}
int main(void){
long long a,b;
cin>>a>>b;
bool zhishu(long long z);
bool huiwen(long long x);
for(int i=a;i<=b;i++){
if(i==2){
cout<<2<<endl;
}
if(i%2==1){
if(huiwen(i)){
if(zhishu(i)){
cout<<i<<endl;
}
}
}
}
return 0;
}
P2415 集合求和
先用数学角度,
两个数的集合,子集分别为,空集,2,3,{2,3},每个数都出现了两次,
三个数的集合,2,3,4,{2,3},{3,4},{2,4},{2,3,4},空集,每个数都出现了四次
一个数的集合,每个数出现了 一次 ,
总结规律:
那么每个数出现的次数就是2的n-1次方
那么所有子集之和是总数乘以2的n-1次方。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
//先用数学角度,两个数的集合,每个数都出现了两次,三个数的集合,每个数都出现了四次
//一个数的集合,每个数出现了 一次 ,那么每个数出现的次数就是2的n-1次方,
//那么所有子集之和是总数乘以2的n-1次方
int main(){
int x;
int n=0;
long long sum=0;
while(cin>>x){
n++;
sum+=x;
}
sum*=pow(2,n-1);
cout<<sum;
return 0;
}
P5743 【深基7.习8】猴子吃桃
递归思想;
知道天数,最后剩一个桃子,也知道规律,每天会吃桃子总数的一半多一个,所以,写方程即可。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
int tao(int m){
if(m==1){
return 1;
}
else if(m==2){
return 4;
}
else{
return (2*tao(m-1)+2);
}
}
int main(void){
long long x;
int n;
int tao(int m);
cin>>n;
cout<<tao(n);
return 0;
}
P5744 【深基7.习9】培训
题目很简单,就是通过去年的成绩来计算今年的成绩,年龄加一,然后输出即可。用结构体或者数组都能完成这道题。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
string name[6];
int a[6],b[6];
int nian(int x){
return (x+1);
}
int ceng(int y){
y=y*(1.2);
if(y>=600){
return 600;
}
return y;
}
int main(){
int nian(int x);
int ceng(int y);
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>name[i]>>a[i]>>b[i];
}
for(int j=0;j<n;j++){
cout<<name[j]<<" "<<nian(a[j])<<" "<<ceng(b[j])<<endl;
}
return 0;
}
这里是红糖,记录我的小白进化史。希望能帮到你们,创作不易,如果觉得有帮助可以为我点个赞!!