牛客小白月赛23
阶乘
题目:给定一个正整数 p 求一个最小的正整数 n,使得 n! 是 p 的倍数1 #include<iostream> 2 #include<map> 3 #include<algorithm> 4 using namespace std; 5 typedef long long ll; 6 map<int,int> prime_factor(int p){//分解质因数 7 map<int,int> res; 8 for (int i = 2; i*i <= p; ++i) { 9 while (p%i == 0) { 10 ++res[i]; 11 p /= i; 12 } 13 } 14 if (p != 1) res[p] = 1; 15 return res; 16 } 17 ll sovle(ll x, ll n) {//找到整除x的n次方的x倍数连乘的最小数
18 ll ans = 1, m, res=x;//res最小为x,记得初始化 19 for (ll i = x*2; ans < n; i += x) {//枚举x的倍数 20 m = i; 21 while (m%x == 0) {//x的倍数能被多少个x整除 22 ++ans; 23 m /= x; 24 } 25 res = i; 26 } 27 return res; 28 } 29 int main() 30 { 31 int t;cin >> t; 32 while (t--) 33 { 34 int p;cin >> p; 35 ll ans = 0; 36 if (p == 1) ans = 1; 37 else { 38 map<int, int> res = prime_factor(p); 39 for (auto i : res) 40 ans = max(ans, sovle(i.first, i.second)); 41 } 42 cout << ans << endl; 43 } 44 return 0; 45 }
H 奇怪的背包问题增加了
题目:给出m个2的k次幂,计算能否选取其中的几个数使之和为2的30次幂。
这几个数都是10,100,1000,10000,....,100000....中选取的,若都比2的30次幂小,它们的和大于2的30次,那么一定满足题意,因为从大到小加的时候,如果位数增加了那么一定只有前面一个1,后面几位都是0,不可能超过2的30次幂
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int maxn = 1e5 + 5; struct Node { ll val; int i; }a[maxn]; bool mycmp(Node a, Node b) { return a.val > b.val; } int b[maxn]; int main() { int t; cin >> t; while (t--) { int m, k, ok = 0; cin >> m; ll sum = 0, ans = 1 << 30; for (int i = 1; i <= m; ++i){ cin >> k; a[i].i = i; a[i].val = (1 << k); sum += a[i].val; if (sum >= ans) ok = 1; b[i] = 0; } if (!ok) cout << "impossible" << endl; else { sum = 0; sort(a + 1, a + m + 1, mycmp); for (int i = 1; i <= m; ++i) { sum += a[i].val; b[a[i].i] = 1; if (sum == ans) break; } for (int i = 1; i <= m; ++i) cout << b[i]; } if(t) cout << endl; } system("pause"); return 0; }
I 寻找字串
字符串的子串是指字符串连续的一段,给定字符串S,找出字典序最大的字串。
易错点:S:zdzz的最大字串是zz,而不是zdzz,当时怎么就转不过来弯呢?所以不可以从前往后遍历z-a找到最大的首字母!
当然也可以找到最大的首字母之后,找到同样首字母的字串再比较字典序,但是srting有现成的字符串分割可以用。
#include<iostream> #include<string> #include<cstring> using namespace std; int main() { string s,ans,temp; cin>>s; ans=s; int len=s.length(); for(int i=0;i<s.length();++i){ temp=s.substr(i,len-i);//substr接起始位置(从0开始)和字串长度 if(temp>ans) ans=temp; } cout<<ans<<endl; return 0; }
本文来自博客园,作者:xiongyuqing,转载请注明原文链接:https://www.cnblogs.com/xiongyuqing/p/12545232.html

浙公网安备 33010602011771号