18203 神奇的勾股数
题意:给你一个正整数n,问有没有一个直角三角形,它所有的边长都是正整数,而且n是它的最小边长。
水题,直角三角形(三边a,b,c),显然 a² = c² - b² = (c+b)*(c-b)
因此,对n² 求一下因子,判断是否是整数解即可,时间复杂度O(n)
#include <iostream>
using namespace std;
int main()
{
int a,n; cin >> a;
n = a * a;
for(int i=1; i*i<=n; i++)
{
if(n % i == 0 && !((n/i-i) & 1) && (n/i-i)/2 > a)
{
cout << (n/i-i)/2 << " " << (n/i+i)/2 << endl;
return 0;
}
}
cout << "NO" << endl;
}
18194 缩小三角形
题意:让你把边长为n的等边三角形缩小成边长为m的等边三角形。
如果一直想着如何从大的三角形去缩小是很难确定一个最优解的,正向不行就逆向咯,考虑一下如何从m->n,就很容易了,每次将最小边a 增大为 b + c - 1 (保证仍能组成三角形),这样类似一个斐波那契递增,显然得到的是最优解。
#include <iostream>
#include <algorithm>
using namespace std;
int nums[3];
int main()
{
int n,m;
while(cin >> n >> m)
{
for(int i=0; i<3; i++) nums[i] = m;
int res = 0;
while(true)
{
sort(nums,nums+3);
if(nums[0] == n)
break;
nums[0] = min(n,nums[1]+nums[2]-1);
res++;
}
cout << res << endl;
}
}
18206 敲代码还是看球赛?
题意:把一个形如A.BeD的科学计数法装换为普通的十进制形式,而且已经简化了很多,题目有说明,A和D没有前导0(但可以为0),B没有尾随0(但可以为0),还规定了一个A为0时,D也必须为0(这个就是跟你说不用去处理那种类似0.0001e2的时候多出来的前导0跟小数点的处理)反正题目已经利用一些规定简化了一堆东西不用处理。。。。。。
很明显,就字符串处理一下。。。模拟题,没什么好说的,除了一点比较坑,题目没有说明,输出的时候最后一行不要输出换行,不然会错
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
int main()
{
#ifdef local
freopen("in.txt","r",stdin);
#endif // local
int T ; cin >> T;
while(T--)
{
string s,A,B; cin >> s;
int epos = s.find('e');
A = s.substr(0,1);
B = s.substr(2,epos-2);
int D = 0;
for(int i=epos+1;i < s.length();i++)
D = D * 10 + s[i] - '0';
if(A == "0" && B == "0")
cout << 0;
else if(D == 0)
{
cout << A;
if(B != "0")
cout << "." << B;
}
else
{
if(A != "0")
cout << A;
for(int i=0;i<max(D,(int)B.length());i++)
{
if(i < B.length()) cout << B[i];
else cout << "0";
if(i == D - 1 && B.length() > D)
cout << ".";
}
}
if(T)
cout << endl;
}
return 0;
}
18212 按要求输出如下2*N+1行图形
题意:没什么好说的,就输出就是了
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
int main()
{
#ifdef local
freopen("in.txt","r",stdin);
#endif // local
int n; cin >>n;
for(int i=0;i<2*n+1;i++)
{
int x = n - abs(n - i);
for(int j=0;j<3*n+x+1;j++)
{
if(j == n - x || j == 3 * n - x || j == n + x || j == 3 * n + x)
cout << "*";
else
cout << " ";
}
cout << endl;
}
return 0;
}
18215 素数划分
题意:把一个数字字符串划分成每一段都不超过6个字符的,判断是否能实现每一段都是质数
直接暴搜dfs,但是感觉数据不是特别完善,而且题目没有说明每一段的数字是否可以包含前导0,但是数据水啊。。。随便搞搞就可以了
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
bool isPrime(int x)
{
if(x < 2)
return false;
for(int i=2;i*i<=x;i++)
if(x % i == 0)
return false;
return true;
}
char s[30+5];
int len;
bool flag = false;
void dfs(int pos)
{
if(pos == len)
flag = true;
if(flag)
return;
int sum = 0;
for(int i=pos;i<min(pos+6,len);i++)
{
sum = sum * 10 + s[i] - '0';
if(isPrime(sum))
dfs(i+1);
}
}
int main()
{
#ifdef local
freopen("in.txt","r",stdin);
#endif // local
cin >>s; len = strlen(s);
dfs(0);
if(flag)
cout << "YES\n";
else
cout << "NO\n";
return 0;
}