牛客小白月赛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;
}

 

 
posted @ 2020-03-22 12:08  xiongyuqing  阅读(294)  评论(0)    收藏  举报