ACM模式突击练习

DAY 1

  1. 字符串最后一个单词的长度

遇到空格重新计数

#include <iostream>
using namespace std;

int main() {
    string str;
    getline(cin,str);
    int length=str.size();
    int res=0;
    for(int i=0;i<length;i++){
        if(str[i]==' ') res=0;
        else res++;
    }
    cout<<res;
}
  1. 计算某字符出现的次数

哈希表,不区分大小写字母,大写字母的ASCII码比小写字母的小32

A --65

a --97

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

int main() {
    string str;
    getline(cin,str);
    char c;
    cin>>c;
    unordered_map<char,int> map;
    for(int i=0;i<str.size();i++){
        map[str[i]]++;
    }
    //不区分大小写
    //A->65
    //a->97
    if(c<='z'&&c>='a')  cout<<map[c]+map[c-32];
    else if(c<='Z'&&c>='A')  cout<<map[c]+map[c+32];
    else cout<<map[c];
}
  1. 明明的随机数

用set直接做

#include <iostream>
#include <vector>
#include <set>
using namespace std;

int main() {
    int N;
    cin>>N;
    vector<int> nums(N);
    for(int i=0;i<N;i++){
        cin>>nums[i];
    }
    set<int> hash(nums.begin(),nums.end());
    for(auto it=hash.begin();it!=hash.end();it++){
        cout<<*it<<endl;
    }
}
  1. 字符串分割

resize一下

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

int main() {
    string str;
    getline(cin,str);
    int length=str.size();
    if(length%8==0){
       int n=str.length()/8;
        for(int i=0;i<n;i++){
            cout<<str.substr(i*8,8)<<endl;
        } 
    }
    else{
        int add=8-length%8;
        str.resize(length+add, '0');
        int n=str.length()/8;
        for(int i=0;i<n;i++){
            cout<<str.substr(i*8,8)<<endl;
        }
    }

}
  1. 进制转换

次方函数pow在cmath头文件里

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

int main() {
    string str;
    cin>>str;
    int sum=0,pos=0;
    for(int i=str.size()-1;i>=2;i--){
        if(str[i]>='0'&&str[i]<='9'){
            int size=(str[i]-'0')*pow(16, pos);
            sum+=size;
        }
        else{
            int size=(str[i]-'A'+10)*pow(16, pos);
            sum+=size;
        }
        pos++;
    }
    cout<<sum;
}
6.质数因子

一个整形n,如果在[2,sqrt(n)]之间能被质因子整除则输出该质因子,不要忘了n/=i和最后的余数n。

#include <cmath>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin>>n;
    if(n==1)    cout<<n;
    vector<int> nums;
    for(int i=2;i<=sqrt(n);i++){
        while(n%i==0){
            nums.push_back(i);
            n/=i;
        }
    }
    if(n!=1)    nums.push_back(n);
    for(int i=0;i<nums.size()-1;i++){
        cout<<nums[i]<<' ';
    }
    cout<<nums[nums.size()-1];
}
7.取近似值

或者直接用四舍五入函数round 在cmath头文件里

#include <iostream>
using namespace std;

int main() {
    float input;
    cin>>input;
    float m=input-(int)input;
    if(m>=0.5)  cout<<(int)input+1;
    else cout<<(int)input;
}
8.合并表记录

哈希表基础

#include <iostream>
#include <map>
#include <vector>
using namespace std;

int main() {
    int n;
    cin>>n;
    vector<vector<int>> nums(n,vector<int>(2));
    for(int i=0;i<n;i++){
        cin>>nums[i][0]>>nums[i][1];
    }
    map<int, int> map;
    for(int i=0;i<n;i++){
        map[nums[i][0]]+=nums[i][1];
    }
    for(auto & it : map){
        cout<<it.first<<' '<<it.second<<endl;
    }
}
9.提取不重复的数

用set去重,还有就是int与字符串之间的转换

#include <iostream>
#include <set>
#include <string>
using namespace std;

int main() {
    int n;
    cin>>n;
    string s=to_string(n);
    string res;
    set<char> set;
    for(int i=s.size()-1;i>=0;i--){
        char c=s[i];
        if(set.find(c)!=set.end())  continue;
        set.insert(c);
        res.push_back(c);
    }
    int result=stoi(res);
    cout<<result;
}
10.字符个数统计
#include <iostream>
#include <set>
using namespace std;

int main() {
    string s;
    cin>>s;
    set<char> set;
    for(char& c : s){
        set.insert(c);
    }
    cout<<set.size();
}
11.数字颠倒
#include <any>
#include <iostream>
#include <string>
using namespace std;

int main() {
    int n;
    cin>>n;
    string s=to_string(n);
    int i=0,j=s.size()-1;
    while (i<j) {
        swap(s[i], s[j]);
        i++;
        j--;
    }
    cout<<s;
}
12.字符串翻转
#include <iostream>
using namespace std;

int main() {
    string s;
    cin>>s;
    for(auto it=s.rbegin();it!=s.rend();it++){
        cout<<*it;
    }
}
13.句子逆序
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<string> strs;
    string s;
    while(cin>>s){
        strs.push_back(s);
    }
    for(auto it=strs.rbegin();it!=strs.rend();it++){
        cout<<*it<<' ';
    }
}
14.字符串排序

multiset 在set头文件下,选对容器就ok

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

int main() {
    int n;
    cin>>n;
    multiset<string> set;
    string s;
    while(cin>>s){
        set.insert(s);
    }
    for(auto i : set){
        cout<<i<<endl;
    }
}
15.求int型正整数在内存中存储1的个数
#include <iostream>
using namespace std;

int main() {
    int n;
    int res=1;
    cin>>n;
    if(n==0)    {cout<<"0";  return 0;}
    while(n!=1){
        if(n%2==0)  n/=2;
        else{
            res++;
            n/=2;
        }
    }
    cout<<res;
}
*16.购物单

0-1背包问题,含有主从性;只将主件当做物品,剩下的两个附件当作主件的附加状态,也就是说物品有4种状态:

只要主件/主件+附件1/主件+附件2/主件+附件1+附件2

剩下的情况就与常规0-1一样。

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

int main() {
    int N,m;//总金额N ,共有m个物品
    cin>>N>>m;
    N/=10;//是10的倍数
    int value,priority,number;
    //从1开始装
    vector<vector<int>> data(m+1,vector<int>(6,0));
    for(int i=1;i<=m;i++){
        cin>>value>>priority>>number;
        //主件
        if(number==0){
            data[i][0]=value/10;
            data[i][1]=priority;
        }
        //第一个附件
        else if(data[number][2]==0){
            data[number][2]=value/10;
            data[number][3]=priority;
        }
        //第二个附件
        else{
            data[number][4]=value/10;
            data[number][5]=priority;
        }
    }
    //背包容量为j时最大满意度  
    //0-1背包问题  组合  先物品后背包 背包倒序
    vector<int> dp(N+1,0);
    for(int i=1;i<=m;i++){
        for(int j=N;j>=data[i][0];j--){
            //第i个物品的基本情况
            //主件
            int valueMaster=data[i][0];
            int priorityMaster=data[i][1];
            //附件1
            int value1=data[i][2];
            int priority1=data[i][3];
            //附件2
            int value2=data[i][4];
            int priority2=data[i][5];

            //有四种情况 
            //1.只选主件
            if(j>=valueMaster){
                dp[j]=max(dp[j],dp[j-valueMaster]+valueMaster*priorityMaster);
            }
            //2.主件+附件1
            if(j>=valueMaster+value1){
                dp[j]=max(dp[j],dp[j-valueMaster-value1]+valueMaster*priorityMaster+value1*priority1);
            }
            //3.主件+附件2
            if(j>=valueMaster+value2){
                dp[j]=max(dp[j],dp[j-valueMaster-value2]+valueMaster*priorityMaster&#
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值