目录
数位染⾊(动态规划-01背包)
题目解析
1.题目链接:数位染色_牛客题霸_牛客网
2.题目描述
描述
小红拿到了一个正整数 x\x 。她可以将其中一些数位染成红色。然后她想让所有染红的数位数字之和等于没染色的数位数字之和。
她不知道能不能达成目标。你能告诉她吗?输入描述:
一个正整数 x\x ,1 \leq x \leq 10^{18}1≤x≤1018
输出描述:
如果小红能按要求完成染色,输出"Yes"。否则输出"No"。
示例1
输入:
1234567
输出:
Yes
说明:
将3、4、7染成红色即可,这样3+4+7=1+2+5+6
示例2
输入:
23
输出:
No
说明:
显然无论如何都不能完成染色。
讲解算法原理
解法:
算法思路:
01背包应⽤题~
编写代码
c++算法代码:
#include <iostream>
using namespace std;
const int N = 20, M = N * 9;
long long x;int n, sum; // 这个数有多少位int arr[N];bool dp[M];
bool fun()
{
if(sum % 2 == 1) return false; sum /= 2; dp[0] = true; for(int i = 0; i < n; i++) { for(int j = sum; j >= arr[i]; j--) { dp[j] = dp[j] || dp[j - arr[i]]; }
}
return dp[sum];
}
int main()
{
cin >> x;
while(x)
{
arr[n++] = x % 10; sum += x % 10; x /= 10;
}
if(fun()) cout << "Yes" << endl; else cout << "No" << endl;
return 0;
}
java算法代码:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in); long x = in.nextLong(); int[] arr = new int[20]; int n = 0, sum = 0; while(x != 0)
{
int t = (int)(x % 10); arr[n++] = t; sum += t; x /= 10;
}
if(sum % 2 == 1)
{
System.out.println("No");
}
else
{
sum /= 2; boolean[] dp = new boolean[sum + 1]; dp[0] = true; for(int i = 0; i < n; i++) { for(int j = sum; j >= arr[i]; j--) { dp[j] = dp[j] || dp[j - arr[i]]; } } if(dp[sum]) System.out.println("Yes"); else System.out.println("No"); }
}
}
素数回⽂(模拟+数学)
题目解析
1.题目链接:素数回文_牛客题霸_牛客网
2.题目描述
描述
现在给出一个素数,这个素数满足两点:
1、 只由1-9组成,并且每个数只出现一次,如13,23,1289。
2、 位数从高到低为递减或递增,如2459,87631。
请你判断一下,这个素数的回文数是否为素数(13的回文数是131,127的回文数是12721)。
输入描述:
输入只有1行。
第1行输入一个整数t,保证t为素数。
数据保证:9<t<109
输出描述:
输出一行字符串,如果t的回文数仍是素数,则输出“prime”,否则输出"noprime"。
示例1
输入:
13
输出:
prime
说明:
13的回文数是131,131是素数
示例2
输入:
17
输出:
noprime
说明:
17的回文数是171,171不是素数(因子有3)
讲解算法原理
解法:
算法思路:
模拟题,注意数据范围~
编写代码
c++算法代码:
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
long long change(string s)
{
for(int i = s.size() - 2; i >= 0; i--)
{
s += s[i];
}
return stol(s);
}
bool isprim(long long x)
{
if(x <= 1) return false; for(long long i = 2; i <= sqrt(x); i++) { if(x % i == 0) return false; } return true;
}
int main()
{
string s;
cin >> s;
long long x = change(s); if(isprim(x)) cout << "prime" << endl; else cout << "noprime" << endl;
return 0;
}
java算法代码:
mport java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
public static long change(String s)
{
StringBuffer tmp = new StringBuffer(s); for(int i = s.length() - 2; i >= 0; i--) { tmp.append(s.charAt(i));
}
return Long.parseLong(tmp.toString());
}
public static boolean isprim(long x)
{
if(x <= 1) return false; for(long i = 2; i <= Math.sqrt(x); i++) { if(x % i == 0) return false; } return true;
}
public static void main(String[] args)
{
Scanner in = new Scanner(System.in); String s = in.next(); long x = change(s); if(isprim(x)) System.out.println("prime"); else System.out.println("noprime"); }
}