day01_算法刷题打卡

转眼都该大三了,即将就业和考研. 压力有点大…

身为计算机专业的菜鸡,对算法了解甚少,等到明年可能学习这个的时间越来越少了,几乎不可能再去认真搞些算法题了(除非面试那一段时间),呜呜呜~~ ,为此给自己制定个 120天算法学习计划,每天至少刷5道算法题,大三下学期参加些竞赛,给自己面试就业加加分. 比我大一届的学长,今年拿了35w的字节Offer,还有个学长拿了B站的Offer. 学长们都很强,我咋能落后呢 !

冲冲冲!

P5743 【深基7.习8】猴子吃桃

法一:递推法

第A天:X个.

第A+1天:X-(X/2+1)=w => X=2 * w + 2;

#include<iostream>
using namespace std;
int d,m;
void solve(){//从后往前进行递归. 
	m = 1;// 某天x: x - (x/2+1) = w =>x = 2*w+2
	for(int i = 2;i<=d;i++){
		m = 2*m+2;
	}
}
int main()
{
	cin>>d;
	solve();
	cout<<m<<endl;
	return 0;
}

法二:模拟

#include<iostream>
using namespace std;
int n,ans=1;//一定要赋值为1!
int main(){
	cin>>n;
	for(int i=1;i<n;i++){//因为第n天没吃,所以之要算n-1天就行了。
		ans+=1;//先加上嘴馋吃的那一个,每天吃一半的是在这个的基础上
		ans*=2;//加上嘴馋吃的那一个以后才是一半
	}
	cout<<ans<<endl;//输出总数
	return 0;//拜拜!
}

P5886 Hello, 2020!

题意分析:n个出题人,m个选手,一共有p个预测数,所以我们可以用一个数组来进行模拟预测情况.最后统计输出即可.

#include<iostream>
#include<vector>
using namespace std;
int arr[1000000+10],n,m,p,w,t;
vector<int> v;
int main()
{
	cin>>n>>m>>p;
	for(int i = 0;i < n;i++){
		cin>>w;
		while(w--){
			cin>>t;
			arr[t]++;
		}
	}
	for(int i = 1;i<=m;i++){ 
		if(arr[i]==p){
			v.push_back(i);	//存放的是编号.. 
		}
	}
	cout<<v.size()<<endl;
	for(int i = 0;i <v.size();i++){
		if(i){
			cout<<" "<<v[i];
		}else{
			cout<<v[i]; 
		}
		//cout<<v[i]<<" "<<endl;
	}
	cout<<endl; 
	return 0;
} 


P1615 西游记公司

分析:这道题本来很简单,可自己傻傻的把时分秒分离出来.搞的很复杂…

自己写的代码

#include<iostream>
#include<string>
#include<stack>
using namespace std;
int h1,h2,m1,m2,s1,s2,n,cnt;
string str1,str2,temp;
unsigned int  res;//当数据较大时.
 
stack<char> s;
int calcu() {
	int m = 0;
	cnt = 1;
	while(!s.empty()) {
		if(cnt==1&&s.size()==2) {
			m += (s.top()-'0')*10;
			cnt++;
		} else {
			m += s.top()-'0';
		}
		s.pop();
	}
	return m;
}

void solve(int &a,int &b,int &c,string &str) { //时分秒
	int flag = 3;
	for(int i = str.size()-1; i>=0; i--) {
		if(str[i]!=':') {
			s.push(str[i]);
		} else if(str[i]==':'&&flag==3) { //计算秒
			c = calcu();
			flag--;

		} else if(str[i]==':'&&flag==2) {
			b = calcu();
			flag--;
		}
	}
	a =  calcu();
}
//使用栈进行分离
int main() {
	cin>>str1>>str2>>n;
	solve(h1,m1,s1,str1);
	solve(h2,m2,s2,str2);
	//res = ((h2*60*60+m2*60+s2)-(h1*60*60+m1*60+s1))*n;
	res =( (h2-h1)*3600+(m2-m1)*60+(s2-s1))*n;
	cout<<res<<endl;
	return 0;
}

大佬们的代码:

精髓: scanf("%d:%d:%d\n%d:%d:%d\n%d", &a, &b, &c, &x, &y, &z, &t)

cin>>a>>ch>>b>>ch>>c>>x>>ch>>y>>ch>>z>>t;

#include<iostream>
using namespace std;
long long a,b,c,x,y,z,t;
char ch;//用于接收中间的字符.
int main()
{
	cin>>a>>ch>>b>>ch>>c>>x>>ch>>y>>ch>>z>>t;
	cout<<((x-a)*3600+(y-b)*60+(z-c))*t<<endl;
	return 0;
}

注意:int类型无法自动转换成Long long类型…即使前者范围比后者大.

P1317 低洼地

解析:a,b存放着上一个高度和当前高度.使用变量l判断 左坡是否形成,再用一个变量r判断右坡是否形成,当都形成的时候说明两者之间存在一个坑.

#include<iostream>
using namespace std;
int l,r,a,b,ans,n;//a:上一个高度,b:当前高度 
int main(){
	
	cin>>n; 
	for(int i = 0;i < n;i++){
		cin>>b;
		if(a>b){//如果有下坡 
			l =  1;
		}else if(b > a && l){//如果是上坡,且上一个是下坡,则说明之间有坑. 
			ans++;
			l = 0;
		}
		a = b;
	}
	cout<<ans<<endl;
	return 0;
}

P4327 [COCI2006-2007#1] Okviri

题目分析:直接暴力解决,思路超简单.虽然代码看起来长,但实际上思路很简单.

#include<iostream>
#include<string>
using namespace std;
string str;
int flag,k;//上一个是否是 三的倍数 
char arr[10][80];
int main()
{
	cin>>str;
	k = 0;
	for(int i = 0;i<str.size();i++){
		k = 4*i;
		if((i+1)%3==0){
			arr[1][k+1] = arr[1][k+2] = arr[1][k+4]=arr[1][k+5]=arr[2][k+1]=arr[2][k+3]=arr[2][k+5]=arr[3][k+2]=arr[3][k+4] =
			arr[5][k+1] = arr[5][k+2] = arr[5][k+4]=arr[5][k+5]=arr[4][k+1]=arr[4][k+3]=arr[4][k+5] = '.';
			arr[1][k+3]=arr[2][k+2]=arr[2][k+4]=arr[3][k+1]=arr[3][k+5]=arr[4][k+2]=arr[4][k+4]=arr[5][k+3]='*';
			arr[3][k+3] = str[i];		
			flag = 1; 
		}else if(flag){//上一个是 3 的倍数 
			arr[1][k+1] = arr[1][k+2] = arr[1][k+4]=arr[1][k+5]=arr[2][k+1]=arr[2][k+3]=arr[2][k+5]=arr[3][k+2]=arr[3][k+4] =
			arr[5][k+1] = arr[5][k+2] = arr[5][k+4]=arr[5][k+5]=arr[4][k+1]=arr[4][k+3]=arr[4][k+5] = '.';
			arr[1][k+3]=arr[2][k+2]=arr[2][k+4]=arr[3][k+5]=arr[4][k+2]=arr[4][k+4]=arr[5][k+3]='#';//该位置arr[3][k+1] 不要进行覆盖修改
			arr[3][k+3] = str[i];
			flag = 0;
		}else{//上一个不是3的倍数. 
			arr[1][k+1] = arr[1][k+2] = arr[1][k+4]=arr[1][k+5]=arr[2][k+1]=arr[2][k+3]=arr[2][k+5]=arr[3][k+2]=arr[3][k+4] =
			arr[5][k+1] = arr[5][k+2] = arr[5][k+4]=arr[5][k+5]=arr[4][k+1]=arr[4][k+3]=arr[4][k+5] = '.';
			arr[1][k+3]=arr[2][k+2]=arr[2][k+4]=arr[3][k+1]=arr[3][k+5]=arr[4][k+2]=arr[4][k+4]=arr[5][k+3]='#';//
			arr[3][k+3] = str[i];
		} 
	}
	for(int i = 1; i <=5;i++){
		for(int j = 1;j <= 4*str.size()+1;j++){
			cout<<arr[i][j];
		}	
		cout<<endl;
	} 
	
	return 0;
}

优化:可以先对数组进行初始化 ‘.’, 然后分情况进行赋值.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的大李子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值