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; }
优化:可以先对数组进行初始化 ‘.’, 然后分情况进行赋值.