1. 程式人生 > >17.10.03

17.10.03

auto rst ng- 背景 sin 代碼 toolbar otto 大於等於

  • 上午
    • 模擬考試
      • Prob.1(AC)轉化為求最多的不重疊的線段(帶權)。也真是巧了,前天大米兔才分享過這個題,只是背景故事不同……
      • Prob.2(WA)神題,好像是概率DP,沒人做出來,網上還沒題解,只有一個光禿禿的STD,看不懂。
      • Prob.3(WA)一個找規律的題,我都做出來了。
      • 但絕望的錯完了,本來以為可以AC呢。

        然後發現數據後發現,沒註意樣例輸出的我多輸出了1mol的空格……

        刪除代碼裏的空格輸出後,就AC了……技術分享

        (怎麽能如此粗心!)

  • 下午
    • 入門OJ
      • 入門OJ 2054: [Noip模擬題]數列計數
      • 求組合數取模

        復習了一下取模質數是階乘逆元的O(n)遞推求法,

        可用於O(1)求組合數

        代碼

        #include<cstdio>
        #include<cstring>
        #include<iostream>
        using namespace std;
        const int mod=2000003;
        int fac[2000005],inv[2000005]; 
        int power(int a,int b)
        {
        	int val=1;
        	while(b)
        	{
        		if(b&1) val=(1ll*val*a)%mod;
        		a=(1ll*a*a)%mod; b>>=1; 
        	}
        	return val;
        }
        void pre_fac_inv(int n)
        {
        	fac[0]=fac[1]=1;
        	for(int i=2;i<=n;i++) fac[i]=(1ll*fac[i-1]*i)%mod;
        	inv[n]=power(fac[n],mod-2);
        	for(int i=n;i>1;i--) inv[i-1]=(1ll*inv[i]*i)%mod;
        	inv[0]=inv[1];
        }
        int c(int m,int n)
        {
        	return 1ll*fac[m]*inv[m-n]%mod*inv[n]%mod;
        }
        int main(){
        	int n;
        	scanf("%d",&n);
        	pre_fac_inv(2*n);
        	int ans=(c(2*n-1,n-1)-n+mod)%mod;
        	printf("%d",(ans*2+n)%mod);
        	return 0;
        }

      • 入門OJ 2055: [Noip模擬題]堆蛋糕
      • 統計兩個數組:

        v[k]表示同類小於等於k的蛋糕的總數量

        w[k]表示同類大於等於k的蛋糕有多少種

        那麽對於一個k是否可成為答案(即可否分成k組),只需滿足:

        v[k]+w[k]*3>=3*k

        代碼

        #include<cstdio>
        #include<cstring>
        #include<iostream>
        #include<algorithm> 
        using namespace std;
        int w[3000005],v[3000005];
        int cnt[3000005],n,r;
        int main(){
        	scanf("%d",&n);
        	for(int i=1,a;i<=n;i++) scanf("%d",&a),cnt[a]++,r=max(r,a);
        	for(int i=1;i<=r;i++) w[cnt[i]]++,v[cnt[i]]+=cnt[i];
        	for(int i=1;i<=n;i++) v[i]+=v[i-1];
        	for(int i=n;i>=1;i--) w[i]+=w[i+1];
        	for(int k=n/3;k>=1;k--){
        		if(v[k-1]+w[k]*k>=3*k){
        			printf("%d",k);
        			break;
        		}
        	}
        	return 0;
        }
        
      • 入門OJ 2059: [Noip模擬題]電費結算
      • 隨著用電量的增加,電費單調遞增

        既然有了單調性,那麽二分就好了

        代碼:

        #include<cstdio>
        #include<cstring>
        #include<iostream>
        #define ll long long
        using namespace std;
        ll allfi,allused,derfi,oneused;
        ll cal(ll used){
        	ll fi=0;
        	if(used<=100) fi+=2*(used-0);
        	else{
        		fi+=2*(100-0);
        		if(used<=10000) fi+=3*(used-100);
        		else{
        			fi+=3*(10000-100);
        			if(used<=1000000) fi+=5*(used-10000);
        			else{
        				fi+=5*(1000000-10000);
        				fi+=7*(used-1000000);
        			}
        		}
        	}
        	return fi;
        }
        ll binary_search(){
        	ll l=1,r=1000000000,mid,ans;
        	while(l<=r){
        		mid=(l+r)>>1;
        		if(cal(mid)<=allfi) ans=mid,l=mid+1;
        		else r=mid-1;
        	}
        	return ans;
        }
        ll binary_sssssssssearch(){
        	ll l=1,r=allused/2,mid,ans;
        	while(l<=r){
        		mid=(l+r)>>1;
        		if(cal(mid)+derfi<=cal(allused-mid)) ans=mid,l=mid+1;
        		else r=mid-1;
        	}
        	return ans;
        }
        int main(){
        	scanf("%lld%lld",&allfi,&derfi);
        	allused=binary_search();
        	oneused=binary_sssssssssearch();
        	printf("%lld",cal(oneused));
        	return 0;
        }

  • 晚上
  • End

17.10.03