目录
🍔🍔🍔🍔
题目1
这种题的解法特别妙
方法一(通法)
🏳️🌈🏳️🌈🏳️🌈🏳️🌈🏳️🌈🏳️🌈
打表找到规律
🏳️🌈🏳️🌈🏳️🌈🏳️🌈🏳️🌈🏳️🌈
打表
#include <iostream> using namespace std; //给定一个m,是否能用p和q凑出来 bool dfs(int m,int p,int q) { if(m == 0) return true; if(m >= p && dfs(m - p,p,q)) return true; if(m >= q && dfs(m - q,p,q)) return true; return false; } int main() { int p,q; cin >> p >> q; int res = 0; for(int i = 1; i <= 1000;i ++) { if(!dfs(i,p,q)) res = i; } cout << res << endl; return 0; }
找规律
#include<iostream> using namespace std; int n,m; int main() { scanf("%d%d",&m,&n); printf("%d\n",(n-1)*m-n); return 0; }
先用上面的代码试几个数,找到规律
方法二
参考:AcWing 1205. 超简洁代码+详解 - AcWing
#include<iostream> using namespace std; int n,m; int main() { scanf("%d%d",&n,&m); int k=n*m; while(k) { int t=k; while(t%m!=0&&t-n>0)t-=n; if(t%m!=0&&k%n!=0&&k%m!=0)//这一步就是判断了1、2、3 三个条件 { printf("%d",k); break; } k--; }
题目2
1002-小q的数列_2021秋季算法入门班第二章习题:递归、分治 (nowcoder.com)
打表找规律
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 0 1 1 2 1 2 2 3 1 2 2 3 2 3 3 4 1 2 pow(2,i)-1
代码
#include<iostream> #include<cmath> #define ll long long using namespace std; ll f(ll n){ if(n==0){ return 0; } else if(n==1){ return 1; } else{ return f(n/2)+f(n%2); } } int main(){ ll a[70]={0}; for(int i=0;i<=63;i++){ a[i]=pow(2,i)-1; } int t; cin>>t; while(t--){ ll n; cin>>n; cout<<f(n)<<" "<<a[f(n)]<<endl; } return 0; }
Code over!