• 【AtCoder】ABC 169


    这 TM 是我打的最郁闷的一场,开场把 D 秒了,然后从 D 开始往回倒叙开题,结果直接栽在了 C 上,交了三发 WA,最后发现竟然是 C 没过…… B用了个 __int128 结果选错语言 CE,怒拉了个高精过来,浪费了许多时间。最终 E 也没有做出来。Rating ±0,真tm的烂。身败名裂了。

    AtCoder Beginner Contest 169

    D Div Game

    一道清新的小数论。我们对每个数做质因数分解 (n={p_0}^{q_0}{p_1}^{q_1}...{p_x}^{q_x}),对于每一个 ({p_i}^{q_i}),我们找 ({q_i}) 最多能拆分成几个不同的整数。显然,最佳的情况应该是 (q_i=1+2+3+...+(x-1)+x),如果 (q_i>1+2+...+x),那么我们就在 (x) 上加上少的数即可。这个非常容易去计算。

    劣质的视频题解

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=1e6+9;
    bool vst[N]; int cnt,pr[N],num[N],ans;
    signed main(){
    	int n; cin>>n;
    	for(int i=2;i<=1000000;i++){
    		if(vst[i]) continue;
    		pr[++cnt]=i;
    		for(int j=2;j<=1000000/i;j++) vst[i*j]=1;
    	}
    	for(int i=1;i<=cnt;i++){
    		int p=pr[i];
    		while(n%p==0){
    			n/=p,num[i]++;
    		}
    		int a=sqrt(num[i]*2);
    		if(a*(a+1)>num[i]*2) a--;
    		ans+=a;
    	}
    	if(n!=1) ans++;
    	cout<<ans<<endl;
    	return 0;
    }
    

    C Multiplication III

    发现考场代码只有一个点不能过。而且精度问题出在一个二位小数乘以100???

    由于可怕的精度问题,我们要设立一个整型变量为 (q=100b),然后我们计算 (q imes n ÷ 100)。然后毒瘤的地方是,读入小数的时候要整数位小数位分开读然后再计算它乘上100……

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    signed main(){
    	int n; cin>>n;
    	int b; cin>>b;
    	char c; cin>>c;
    	int d; cin>>d;
    	int q=b*100+d;
    	n*=q;
    	cout<<n/100;
    	return 0;
    }
    

    B Multipilication II

    每次乘法前,用除法判断 两数相乘是否大于 (10^{18})

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n,res=1;
    signed main(){
    	scanf("%lld",&n);
    	while(n--){
    		int a; scanf("%lld",&a);
    		if(a==0) return puts("0"),0;
    		else if(1000000000000000000/a<res) res=-1;
    		if(res!=-1) res*=a;
    		if(res>1000000000000000000) res=-1;
    	}
    	printf("%lld",res);
    	return 0;
    }
    

    A Multipilication I

    大水题。

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	int a,b; cin>>a>>b; cout<<a*b;
    	return 0;
    }
    

    E Count Median

    一个结论题。

    我们稍微手动枚举一下(打表),我们发现我们可以取得最小中位数和最大中位数之间的所有中位数,都可以被取到。(至于一个感性的分析,我放在视频讲解中了)。

    所以,我们按照这个写一个程序,先算出最小取到的中位数和最大取到的中位数,然后用分类讨论,等差数列求项数公式求出即可。(偶数的情况公差是0.5,奇数的情况公差是1)。

    #include<bits/stdc++.h>
    using namespace std;
    double mn,mx;
    struct num{int A,B;}a[1000009];
    bool cmp1(const num&a,const num&b){return a.A<b.A;}
    bool cmp2(const num&a,const num&b){return a.B<b.B;}
    int main(){
    	int n; scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d%d",&a[i].A,&a[i].B);
    	sort(a+1,a+n+1,cmp1); mn=(a[(n+1)/2].A+a[(n+2)/2].A)/2.;
    	sort(a+1,a+n+1,cmp2); mx=(a[(n+1)/2].B+a[(n+2)/2].B)/2.;
    	if(n&1) printf("%d",(int)(mx-mn+1));
    	else printf("%d",(int)(2*(mx-mn+0.5)));
    	return 0;
    } 
    

    劣质的视屏题解

  • 相关阅读:
    jps命令
    Collection
    java.lang包中异常
    final关键字
    JVM运行时数据区域
    String详解
    哈希码
    Java虚拟机
    垃圾收集器与内存分配策略
    solr简介
  • 原文地址:https://www.cnblogs.com/TetrisCandy/p/ABC169.html
Copyright © 2020-2023  润新知