码客行十一集训笔记
string
#include <bits/stdc++.h>
using namespace std;
int main()
{
//定义关键字:string
string a;
string s1,s2; //2个
string f[50],s; //字符串数组
//'a'=97 'A'=65 '0'=48
cin>>a; //输入
cout<<a<<endl; //输出
printf("%s\n",a.c_str()); //同理
scanf("%s",a.c_str()); //scanf 和 printf 要用 .c_str() 或 char x[...]
printf("%s",a.c_str());
getline(cin,a); //输入整行
//f[0]="123" + "45" ; error
f[1]=string("123")+"45";
f[2]=string("123")+string("45");
f[3]="12345";
f[4].size(); f[4].length();//求长度e
f[5].empty()//空?
//s[0] == s.front()
//s[s.size()-1] == s.back();
//s[i];
s.erase(0,5);//从0向后删5个
s="1111";
t="1";
s.find(t);//查找
//find找不到返回 string::npos
s.substr(3,2);//从3起向后取2个字符
}
贪心
贪心:对于问题求解时总是做出在当前看来是最好的选择
必须无后效性(某个状态以后的过程不会影响以前的状态,只与当前状态有关)
1.建立数学模型来描述问题
2.把求解的问题分成多个子问题
3.求解,得到子问题的局部最优解
4.把子问题最优解合成原解问题的解
while(能朝给定总目标前进一步)
{
利用可行决策,求出可行解的一个解元素;
}
例一
题目描述
有 N 个人排队到 R 哥水龙头去打水,他们装满水桶的
时间为 T[1],T[2],……,T[N] 为整数且各不相等,
应如何安排他们的打水顺序才能是他们花费的时间最少?
输入描述
第 1 行 2 个整数 n 和 r,用一个空格隔开,分别表示
接水人数和龙头个数。
第 2 行 n 个整数 t[1]、t[2]、……、t[n],每两个整数之
间用一个空格隔开,t[i] 表示 i 号同学的打水时间。
输出描述
输出只有一行,1 个整数,表示接水所需的总时间。
样例1:
输入
4 2
2 6 4 5
输出
23
分析
问题转移:
花费时间最少->等待时间最少
方法讨论:
让快的先打,让慢的等快的
思路:
a[n]
s[r] 水龙头(花费时间)
sum=0
for(int i=0;i<n;i++)
{
人:
s[0]=s[0]+a[0]-> s[0]:a[0]的等待时间;a[0]:a[0]的打水时间
sum+s[0]
}
代码
#include <bits/stdc++.h>
using namespace std;
const int MAX_PEOPLE=1010;
int n,r,sum,a[MAX_PEOPLE],s[MAX_PEOPLE];
int main()
{
//以下代码使用后c输入输出不能和c++一起用(二选一)
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>r;
//输入人的数据
for(int i=0;i<n;i++)
{
cin>>a[i];
}
//排序(让快的先打)
sort(a,a+n);
//开始处理
int k=0;//当前处理的水龙头
for(int i=0;i<n;i++)
{
//i:当前处理的人
if(k==r) k=0;
//见例1.rc-思路
s[k]=s[k]+a[i];
sum+=s[k];
k++;
}
cout<<sum<<endl;
}
模拟
模拟就是用计算机来模拟题目中要求的算法(操作)
技巧:
1.写代码前,在草纸上写好流程
2.把各部分模块化
3.要思路清晰
枚举
枚举是基于已知来猜答案的一种问题求解策略
枚举思想是不断地猜测,一一尝试
本文来自博客园,作者:jtbg,转载请注明原文链接:https://www.cnblogs.com/jtbg/articles/19377780
博客最新公告
浙公网安备 33010602011771号