3 数学知识专题

1、数位统计✔

统计每位1出现的次数,再遍历每一位就行了。
对于每一位的计算,根据0,1,>1三种情况分别计算。
可参考《算法基础课》数位统计DP的思路,这题只是那题的特例
1049 Counting Ones

#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
using  namespace std;
const int N =40;

int main(){
    int x;cin>>x;

    vector<int> c;
    while(x){
        c.push_back(x%10);
        x/=10;
    }
    reverse(c.begin(),c.end());

    int ans=0;
    for(int i=0;i<c.size();i++){
        int abc=0,efg=0;
        for(int j=0;j<i;j++) abc = abc*10+c[j];
        for(int j=i+1;j<c.size();j++) efg = efg *10 +c[j];
        if(c[i]==0){
            ans += abc * pow(10,c.size()-i-1);
        }
        else if(c[i]==1){
            ans += abc * pow(10,c.size()-i-1) + efg+1;
        }
        else if(c[i]>1){
            ans += (abc+1) * pow(10,c.size()-i-1);
        }
        
    }
    cout<<ans<<endl;
    return 0;
}
2、质因素分解✔

可以参考y总的方式,就不用map额外存储了。
测试点3如果N=1,输出1=1;
1059 Prime Factors #质因素分解

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
int a[2];
int main(){
    map<long long,int> m;
    long long x;cin>>x;
    cout<<x<<"=";
    if (x==1) {
        cout<<x<<endl;
        return 0;
    }
    long long i=2;

    while(x!=1){
        if(x%i==0){
            m[i]+=1;
            x/=i;
        }
        else i++;
    }
    bool first = true;
    for(auto &v:m){
        if(first){
            cout<<v.first;
            first =false;
        }
        else cout<<"*"<<v.first;
        if(v.second>1) cout<<"^"<<v.second;
    }
    cout<<endl;
    
}
3、分数相加

1081 Rational Sum #最大公约数


4、分数运算

1088 Rational Arithmetic #最大公约数


5、连续的因子✔

先求出全部因子,再枚举起始位置。判断是否满足条件进行延申长度。
1096 Consecutive Factors

#include<iostream>
#include<vector>
#include<algorithm>
using     namespace std;
int main(){
    int x;cin>>x;
    vector<int> v;
    for(int i=2;i<=x/i;i++){
        if(x%i==0){
            v.push_back(i);
            if(i*i!=x) v.push_back(x/i);
        }
    }
    v.push_back(x);
    sort(v.begin(),v.end());
    // for(auto &vv:v){
    //     cout<<vv<<" ";
    // }

    int n=v.size();

    int max=0,pos;
    for(int k=0;k<n;k++){  //从k开始
        int ans=v[k];
        int cnt=1;
        for(int i=k+1;i<n;i++){
            if(v[i]==v[i-1]+1 && x%(ans*v[i])==0 && ans*v[i]<=x){
                ans*=v[i];
                cnt++;
            }
            else break;
        }
        if(cnt>max){
            max=cnt;
            pos = k;
        }
    }
    
    cout<<max<<endl;
    cout<<v[pos];
    for(int i=pos+1;i<pos+max;i++){
        cout<<"*"<<v[i];
    }
    cout<<endl;
}
6、整数分解✔

二维背包问题;完全背包;求具体方案;和最大;
为满足和最大,不能单纯使用0,1判别,用-0x3f表示不存在,>0的值表示所有方案中取和最大;
1103 Integer Factorization #背包问题

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
const int N = 410;
int f[21][N][N];

int main(){
    int n,k,p;
    cin>>n>>k>>p;
    memset(f,-0x3f,sizeof f);
    for(int m=1;m<=21;m++) f[m][0][0]=0;
    
    int m=1;
    for(;;m++){
        int v = pow(m,p);
        if(v>n) break;
        
        for(int i=1;i<=n;i++){
            for(int j=1;j<=k;j++){
                f[m][i][j] = f[m-1][i][j];
                if(i>=v && j>0) f[m][i][j] = max(f[m][i][j],f[m][i-v][j-1]+m);
            }
        }
    }m--;
    // for(int i =2 ;i<=m;i++)
    //  cout<<i<<" " <<f[i][n][k]<<endl;

    // for(int i =2 ;i<=n;i++)
     // cout<<i<<" " <<f[2][i][k]<<endl;

    if(f[m][n][k] <0 ) cout<<"Impossible"<<endl;
    else{
        cout<<n<<" = ";
        bool first=true;
        int i=n,j=k;
        while(f[m][i][j]>=0){
            int v = pow(m,p);
            if(f[m][i-v][j-1]+m >= f[m][i][j] ){
                if(first) cout<<m<<"^"<<p,first=false;
                else cout<<" + "<<m<<"^"<<p;
                i = i-v;
                j = j-1;
            }
            else{
                m--;
            }
        }
        cout<<endl;

        
    }
    return 0;
}
7、数段之和✔

找规律+long double+print(“%.2Lf”);
1104 Sum of Number Segments

#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5+10;

int main(){
    int n;cin>>n;
    long double sum=0;
    for(int i=1;i<=n;i++){
        double x;
        cin>>x;
        sum+=x*(i)*(n+1-i)  ;  
    }
    

    printf("%.2Lf\n",sum);
    
}
8、卡住的键盘✔

1112 Stucked Keyboard

#include<iostream>
#include<cstring>
#include<unordered_set>
using namespace std;
const int N = 110;

int main(){
    int n;
    cin>>n;
    
    string s;
    cin>>s;

    unordered_set<char> set;
    int k=1;
    for(int i=1;i<s.size();i++){
        if(s[i]==s[i-1]){
            k++;
        }
        else {
            if(k%n!=0) set.insert(s[i-1]);
            k=1;
        }
    }
    if(k%n!=0) set.insert(s[s.size()-1]);
    

    string ans="";
    unordered_set<char> set2;
    for(int i=0;i<s.size();i++){
        ans += s.substr(i,1);
        if(!set.count(s[i]) ) {
            if(!set2.count(s[i])) cout<<s[i];
            set2.insert(s[i]);
            i+=n-1;
        }
        

    }
    cout<<endl;
    
    cout<<ans<<endl;
}
9、质数判断✔

根据排名输出。
1116 Come on! Let’s C

#include<iostream>
#include<cstring>
#include<unordered_map>
using namespace std;

bool isprime(int x){
    for(int i=2;i<=x/i;i++){
        if(x%i==0) return false;
    }
    return true;
}

int main(){
    int n;cin>>n;
    
    unordered_map<string,string> map;
    string id;cin>>id;
    map[id] = "Mystery Award";
    for(int i=2;i<=n;i++){
        cin>>id;
        if(isprime(i)) map[id] = "Minion";
        else map[id] = "Chocolate";
    }

    unordered_map<string,int> visited;
    int k;cin>>k;
    while(k--){
        cin>>id;
        if(!map.count(id)) cout<<id<<": Are you kidding?"<<endl;
        else {
            cout<<id<<": ";
            if(visited.count(id)) cout<<"Checked"<<endl;
            else cout<<map[id]<<endl;
            visited[id]=1;
        }
    }
}
10、质数判断✔

连续字符串中找长度为k的质数。
1152 Google Recruitment

#include<iostream>
#include<cstring>
using namespace std;

bool isprime(int x){
    for(int i=2;i<=x/i;i++){
        if(x%i==0) return false;
    }
    return true;
}

int main(){
    int l,k;
    cin>>l>>k;
    string s;
    cin>>s;
    for(int i=0;i<s.size()-k+1;i++){
        string a = s.substr(i,k);
        if(isprime(stoi(a))) {
            cout<<a<<endl;
            return 0;
        }
    }
    cout<<404<<endl;
}

#进位制

进制

1482 1010. Radix
1492 1015. Reversible Primes
1504 1027. Colors in Mars
1590 1100. Mars Numbers

1231 1019. General Palindromic Number

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值