day01_算法刷题打卡

简介: day01_算法刷题打卡

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;
}

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

相关文章
|
2月前
|
机器学习/深度学习 存储 算法
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
|
5月前
|
自然语言处理 算法
算法刷题(二十三):Bigram 分词
算法刷题(二十三):Bigram 分词
41 0
|
5月前
|
算法
算法刷题(二十二):宝石与石头
算法刷题(二十二):宝石与石头
39 0
|
7月前
|
算法 IDE 程序员
【day1】【洛谷算法题】-B2002Hello,World-刷题反思集
【day1】【洛谷算法题】-B2002Hello,World-刷题反思集
|
7月前
|
算法
算法刷题-数组
算法刷题-数组
36 0
算法刷题-数组
|
20天前
|
算法
算法系列--链表刷题(二)(下)
算法系列--链表刷题(二)(下)
16 0
|
8月前
|
算法
炸了!力扣官方首发了这套1568页LeetCode算法刷题笔记(彩页版)
你知道现在LeetCode算法在大厂中的重要性吗? 前几天小编看了一个国内算法大神的短视频,他就在视频中指出了算法对当下无论是生活还是找工作中都是非常重要的! 没错这个人就是江湖人称“左神”的左程云老师 小编也简单看了一下一些比较知名互联网大厂的招聘,像阿里,字节,美团,京东,百度等都在简介明确写上了要求“算法精通”! 那么如何达到“算法精通”今天小编特意给大家分享出一套1568页的LeetCode算法刷题(彩页版)笔记,助力你早日在简历写上“算法精通”
炸了!力扣官方首发了这套1568页LeetCode算法刷题笔记(彩页版)
|
4月前
|
算法 定位技术
每日刷题|贪心算法初识
每日刷题|贪心算法初识
|
5月前
|
算法
六六力扣刷题贪心算法之柠檬水找零
六六力扣刷题贪心算法之柠檬水找零
38 0
|
5月前
|
人工智能 算法 索引
六六力扣刷题贪心算法之K次取反后最大化的数组和
六六力扣刷题贪心算法之K次取反后最大化的数组和
22 0