實現技巧之分段
阿新 • • 發佈:2018-09-14
esp return src sign .org eof string sstream map
POJ3273
按每個月的權值進行分段
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 5 #include<cstring> 6 #include<vector> 7 #include<set> 8 #include<queue> 9 #define pii pair<int,int> 10 #define fi first 11 #define se second 12View Code#define mp make_pair 13 #define pb push_back 14 #define rep(i, a, b) for(int i=(a); i<(b); i++) 15 #define sz(a) (int)a.size() 16 #define de(a) cout << #a << " = " << a << endl 17 #define dd(a) cout << #a << " = " << a << " " 18 #define all(a) a.begin(), a.end() 19#define endl "\n" 20 #define INF 0x3f3f3f3f 21 #include <iostream> 22 using namespace std; 23 #define M 200000+ 24 const int maxn=1e5+7; 25 #define eps 1e-5 26 typedef long long ll; 27 ll n,m,sum; 28 double a[maxn]; 29 bool check(ll mid) 30 { 31 int ret=0,cnt=1; 32 rep(i,0,n){ 33 ret+=a[i];34 if(ret>mid){ 35 cnt++; 36 ret=a[i]; 37 } 38 } 39 return cnt<=m; 40 } 41 int main() 42 { 43 cin>>n>>m; 44 ll max=0; 45 rep(i,0,n){ 46 cin>>a[i],sum+=a[i];if(a[i]>max)max=a[i]; 47 } 48 ll l=max,r=sum,ans=0,mid; 49 while(r>=l) 50 { 51 mid=(r+l)/2; 52 if(check(mid))r=mid-1; 53 else l=mid+1; 54 } 55 cout<<mid<<endl; 56 return 0; 57 }
最長遞增子段
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 #include<cstring> 6 #include<map> 7 #include<set> 8 #include<cmath> 9 #include<queue> 10 #include<bitset> 11 #include<utility> 12 #include<functional> 13 #include<iomanip> 14 #include<sstream> 15 #include<ctime> 16 #include<cassert> 17 #define A first 18 #define B second 19 #define mp make_pair 20 #define pb push_back 21 #define pw(x) (1ll << (x)) 22 #define sz(x) ((int)(x).size()) 23 #define all(x) (x).begin(),(x).end() 24 #define rep(i,l,r) for(int i=(l);i<(r);i++) 25 #define per(i,r,l) for(int i=(r);i>=(l);i--) 26 #define FOR(i,l,r) for(int i=(l);i<=(r);i++) 27 #define eps 1e-9 28 #define PIE acos(-1) 29 #define cl(a,b) memset(a,b,sizeof(a)) 30 #define fastio ios::sync_with_stdio(false);cin.tie(0); 31 #define lson l , mid , ls 32 #define rson mid + 1 , r , rs 33 #define ls (rt<<1) 34 #define rs (ls|1) 35 #define INF 0x3f3f3f3f 36 #define lowbit(x) (x&(-x)) 37 #define sqr(a) a*a 38 #define ll long long 39 #define ull unsigned long long 40 #define vi vector<int> 41 #define pii pair<int, int> 42 #define dd(x) cout << #x << " = " << (x) << ", " 43 #define de(x) cout << #x << " = " << (x) << "\n" 44 #define endl "\n" 45 using namespace std; 46 //********************************** 47 const int maxn=135+300; 48 int a[maxn],front[maxn],rear[maxn]; 49 int n; 50 //********************************** 51 52 //********************************** 53 int main() 54 { 55 cin>>n; 56 int cnt=1; 57 FOR(i,1,n){ 58 scanf("%d",&a[i]); 59 if(a[i]>a[i-1]&&i!=1)cnt++; 60 else cnt=1; 61 rear[i]=cnt; 62 int tmp=cnt; 63 do{ 64 front[i-tmp+1]=tmp; 65 }while(tmp--); 66 } 67 // FOR(i,1,n){ 68 // dd(i);dd(front[i]);de(rear[i]); 69 // } 70 // per(i,n-1,1){ 71 // front[i-rear[i]]=front[i]; 72 // } 73 int ans=1; 74 FOR(i,1,n){ 75 // ans=max(ans,front[i]); 76 // dd(i);dd(front[i]);de(rear[i]); 77 if(a[i+1]>=a[i-1]+2)ans=max(ans,front[i+1]+rear[i-1]+1); 78 else { 79 ans=max(ans,1+rear[i-1]); 80 ans=max(ans,1+front[i+1]); 81 } 82 } 83 cout<<ans<<endl; 84 return 0; 85 }View Code
實現技巧之分段