算法中关于数学的题目练习
- 1、买不到的数目
- 题目信息
- 思路
- 题解
- 2、蚂蚁感冒
- 题目信息
- 思路
- 题解
- 3、饮料换购
- 题目信息
- 思路
- 题解
1、买不到的数目
题目信息
思路
数学结论(证明略):
p、q为正整数且互质,不能由p、q凑出来的最大的数为(p-1)(q-1)-1
不知道数学结论可以打表找规律
题解
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int p,q;
cin>>p>>q;
cout<<(p-1)*(q-1)-1<<endl;
return 0;
}
2、蚂蚁感冒
题目信息
思路
两个蚂蚁想碰之后感冒回头可以看成两个蚂蚁相碰之后感冒继续向原来的方向走
第一个蚂蚁向右走的情况:
1.右边向左走的,必然被感染
2.右边向右走,必然不会被感染
3.左边向左走,必然不会被感染
4.左边向右走:
(1) 右边存在向左走,则必然被感染
(2) 右边不存在向左走,则必然不会被感染
题解
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define maxsize 50
using namespace std;
int x[maxsize];
int n;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int left=0,right=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x[i];
}
for(int i=1;i<n;i++)
{
if(abs(x[i])>abs(x[0])&&x[i]<0) right++;
}
for(int i=1;i<=n;i++)
{
if(abs(x[i])<abs(x[0])&&x[i]>0) left++;
}
if(right==0&&x[0]>0 || left==0&&x[0]<0) cout<<1;
else cout<<left+right+1;
return 0;
}
3、饮料换购
题目信息
思路
题解
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
int res=n;
while(n>=3)
{
res =res+n/3;
n=n/3+n%3;
}
cout<<res<<endl;
return 0;
}