链接:http://codeforces.com/contest/1062
A - Prank - [二分]
题意:
给出长度为 $n(1 \le n \le 100)$ 的数组 $a[1 \sim n]$,且满足 $1 \le a[1] < a[2] < \cdots < a[n] \e 1000$。现在JATC要擦掉其中一段连续的数字,但是要求能够通过剩余的其他数字,推断出擦掉的数字是什么。求JATC能擦掉的最长长度。
题解:
其实 $O(n)$ 就可以求出能擦掉的最长长度,但是因为 $n$ 比较小,懒得考虑太多,直接二分吧……
二分能擦掉的长度,对于固定的长度,$O(n)$ 枚举始末点判断能否擦除即可。
AC代码:
#include<bits/stdc++.h> using namespace std; const int maxn=105; int n,a[maxn]; bool judge(int k) { for(int i=1,j=i+k-1;j<=n;i++,j++) { if(a[j+1]-a[i-1]==k+1) return 1; } return 0; } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; a[0]=0, a[n+1]=1001; int l=0, r=n; while(l<r) { int mid=(l+r+1)/2; if(judge(mid)) l=mid; else r=mid-1; } cout<<l<<endl; }
B - Math - [数学题]
题意:
给出一个正整数 $n(1 \le n \le 1e6)$,你现在可以对 $n$ 进行任意多次乘以正整数 $x$ 或者开方(当结果为整数时才允许开方)操作。
求结果最小为多少,达到这个结果最少进行多少次操作。
题解:
分解质因数 $n = {p_1}^{a_1}{p_2}^{a_2} \cdots {p_k}^{a_k}$,显然最后结果只能是 $p_1 p_2 \cdots p_k$,那么如何才能得到 $p_1 p_2 \cdots p_k$?
找到 $\max(a_i)$,求得比小于它的最小 $2^x$,这样一来先做一次乘法把 $n$ 乘到 ${p_1}^{2^x}{p_2}^{2^x} \cdots {p_k}^{2^x}$,然后做 $2^x$ 次开方操作即可得到 $p_1 p_2 \cdots p_k$。因此最少 $x+1$ 次操作。
(当然,还有一些数字本身就是最小结果,这些另作判断即可。)
AC代码:
#include<bits/stdc++.h> using namespace std; int n; pair<int,int> solve(int n) { if(n<=1) return make_pair(n,0); int res=1,mx=0, mn=20; for(int i=2;i*i<=n;i++) { if(n%i==0) { res*=i; int cnt=0; while(n%i==0) n/=i, cnt++; mx=max(cnt,mx); mn=min(cnt,mn); } } if(n>1) res*=n, mx=max(1,mx), mn=min(1,mn); int t=ceil(log2(mx))+1e-8; if(mn==mx && (1<<t)==mx) return make_pair(res,t); else return make_pair(res,t+1); } int main() { while(cin>>n) { pair<int,int> ans=solve(n); cout<<ans.first<<‘ ‘<<ans.second<<endl; } }
C - Banh-mi - []
D - Fun with Integers - []
E - Company - []
原文地址:https://www.cnblogs.com/dilthey/p/9974790.html
时间: 2024-10-30 20:36:42