Posted onInacm
,
基础 Symbols count in article: 2.4kReading time ≈2 mins.
二分
找最大
1 2 3 4 5 6 7 8 9 10 11 12 13
boolcheck(int x) {/* ... */} // 检查x是否满足某种性质
intbsearch(int l, int r) { while (l < r) { int mid = l + r + 1 >> 1; if (check(mid)) l = mid;//check中的mid符合条件包含 else r = mid - 1; } return l; } //有可能不存在,需要特判一下是否存在.
找最小
1 2 3 4 5 6 7 8 9 10 11 12 13
boolcheck(int x) {/* ... */} // 检查x是否满足某种性质
intbsearch(int l, int r) { while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid;//check中的mid符合条件包含 else l = mid + 1; } return l; } //有可能不存在,需要特判一下是否存在.
# include <stdio.h> # include <string.h> # include <algorithm> # include <iostream> # include <functional> using namespace std; #define LL long long const int maxn=1e8;
LL int node(LL int q,LL int p)//输出第q行第p列的值的大小 { LL int sum=1; for(int i=q;i>=q-p+1;--i) { sum*=i; } for(int j=1;j<=p;++j) sum/=j; return sum; }
LL int jie(int k)//算出前面有几个数(也可以用等差数列公式) { LL int zong=0; for(int i=1;i<=k;++i) zong+=i; return zong; } int main()
{ int n; cin>>n; int sum=0; if(n==1) cout<<1<<endl;//特殊情况 else{ for(int i=20;i>=0;--i)//对每一列进行查找 { int l=2*i; int r=n; while(l<=r)//二分查找 { int mid=(l+r)>>1; LL int o=node(mid,i); if(o==n) { sum=1; cout<<jie(mid)+i+1<<endl; break; } else if(o>n)//大了的话行数变小 { r=mid-1; } else//行数变大 l=mid+1; } if(sum==1) break; } } }
/* * @Author: CrayonXiaoxin * @Date: 2023-12-13 20:31:58 * @LastEditors: Do not edit * @LastEditTime: 2023-12-20 19:47:20 * @FilePath: \c++\code\C.cpp */ #include<iostream> using namespace std; #define ll long long int constint maxn = 2e5+10; int a[maxn]; int n; voidsolve() { for (int i = 0; i < n;++i) cin >> a[i]; for (int i = 1; i < n;++i) { int tem = a[i]; int now = i; while(now>=1) { if(a[now-1]>tem) { a[now] = a[now-1]; now--; } else { break; } }
a[now] = tem; for (int i = 0; i < n;++i) { cout << a[i] << " "; } cout << "\n"; } }