一、strtok字符串分割:
原型:char *strtok(char *str, const char *delim);
功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
说明:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
返回值:从s开头开始的一个个被分割的串。当s中的字符查找到末尾时,返回NULL。如果查找不到delim中的字符时,返回当前strtok的字符串的指针。所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
使用(c++):
#include<iostream> #include<cstring> using namespace std; int main() { char sentence[]="This is a sentence with 7 tokens"; cout << "The string to be tokenized is:\n" << sentence << "\n\nThe tokens are:\n\n"; char *tokenPtr=strtok(sentence,""); while(tokenPtr!=NULL) { cout<<tokenPtr<<'\n'; tokenPtr=strtok(NULL,""); } //cout << "After strtok,sentence=" << tokenPtr<<endl; return 0; }
也就是将数组分为两组,使这两组子数组之和的差的绝对值最小。
思路:首先把数组a的所有元素求和sum, 然后取和的一半设为x,然后遍历数组a的所有子集并且分别求出所有子集的元素之和sum(i);比较abs(x-sum(i)),取小。
实现(c++):
//数组平分算法 int getMinTime(const vector<int>& arr){ int n = arr.size(); int sum = 0; for(int i=0;i<n;i++){ sum += arr[i]; } int minTime = sum,tmp = 0; for(int i=0;i<n;i++){ tmp = 0; for(int j=i;j<n;j++){ tmp += arr[j]; //cout<<sum/2<<tmp<<" "<<minTime; if((tmp>(sum/2))&&(tmp<minTime)){ minTime = tmp; } } } return minTime; }
例子:如果定义了vector<int> arr,在函数调用时比如这样是不行的:
int func(int *arr){ //... }正确的做法:
int func(const vector<int>& arr){ //... }对于字符串数组亦如此:
void func(const vector<string>& str){ //... }
题意大致如下:牛郎和织女被惩罚洗衣服,要在最快的时间洗完。现有若干颜色和数量的衣服,牛郎和织女可以同时洗,一共有两个搓衣板,两人只能在洗完一种颜色的衣服之后才能洗其他颜色的衣服,并且若其中一人洗完后发现另外一人正在洗该颜色最后一件时,必须先等ta洗完才能一起洗其他颜色衣服。
input:
输入包含若干测试用例,第一行是m,n两个正整数(m<10,n<100)分别代表颜色和衣服数量。第二行包含m和颜色字符串,字符串之间空格分开,接下来是n行字符串,每行字符串分别描述洗涤时间和颜色,洗涤时间不超过1000,同样洗涤时间和颜色用空格分开。
output:
总最小洗涤时间
输入示例:
3 4 yellow red blue 2 yellow 3 red 4 red 6 blue
12
#include <iostream> #include <string.h> #include <vector> using namespace std; //匹配字符串数组对应下标 int getIndex(const vector<string>& str,int n,string s){ int index = 0; for(int i=0;i<n;i++){ if(str[i]!=s){ index++; }else{ return index; } } } //数组平分算法 int getMinTime(const vector<int>& arr){ int n = arr.size(); int sum = 0; for(int i=0;i<n;i++){ sum += arr[i]; } int minTime = sum,tmp = 0; for(int i=0;i<n;i++){ tmp = 0; for(int j=i;j<n;j++){ tmp += arr[j]; //cout<<sum/2<<tmp<<" "<<minTime; if((tmp>(sum/2))&&(tmp<minTime)){ minTime = tmp; } } } return minTime; } int main() { int m,n; while(cin>>m>>n){ vector <string> color(m);//存储颜色字符串数组 for(int i=0;i<m;i++){ cin>>color[i]; } vector <vector<int> > time(m,vector<int>(0));//存储对应时间数组 int t; string c; //将对应颜色分类存储进time二维数组 for(int i=0;i<n;i++){ cin>>t>>c; int index = getIndex(color,n,c); time[index].push_back(t); } int tmp = 0; for(int i=0;i<m;i++){ tmp += getMinTime(time[i]);//调用数组平分算法并求和 } cout<<tmp<<endl; } return 0; }