码客行十一集训笔记

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.要思路清晰

枚举

枚举是基于已知来猜答案的一种问题求解策略
枚举思想是不断地猜测,一一尝试

posted @ 2025-12-21 11:17  jtbg  阅读(1)  评论(0)    收藏  举报