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

身为计算机专业的菜鸡,对算法了解甚少,等到明年可能学习这个的时间越来越少了,几乎不可能再去认真搞些算法题了(除非面试那一段时间),呜呜呜~~ ,为此给自己制定个 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;
}

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