码迷,mamicode.com
首页 > 其他好文 > 详细

17.10.03

时间:2017-10-03 18:11:56      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:neu   bottom   电量   top   while   efi   递增   考试   return   

  • 上午
    • 模拟考试
      • 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

标签:neu   bottom   电量   top   while   efi   递增   考试   return   

原文地址:http://www.cnblogs.com/zj75211/p/7624024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!