2019 ACM训练计划——( 每天5题 ) 训练计划⑧
发布日期:2021-06-29 14:25:45 浏览次数:3 分类:技术文章

本文共 2737 字,大约阅读时间需要 9 分钟。

A


题目大意

改版后的求T素数,除开1和本身外,还有一个数 求三个因子


题解

来分析一下对于每个数的情况,要满足题意只有三个因子的话,除开1和本身,那么另一个数一定是自己平方因子(即那个数的平方等于自己)

所以我们可以做一个剪枝:
对于m=sqrt(n) 在2到m中如果还存在因子的话,那么代表不符合题意 直接跳出来输出NO
然后我们对于n==1需要特别处理一下 直接输出NO即可

#include
using namespace std;const int maxn=1e5+5;long long n;int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){
for(int i=0;i
>x; long long m=sqrtl(x); int ff=1; if(x==1) ff=0; for(int j=2;ff&&j*j<=m;j++){
if(m%j==0) ff=0; } if(m*m==x&&ff) cout<<"YES"<

B


题目大意

求你是否能通过一次操作reverse数组的一段区域,然后使得整个数组是递增的


题解

一开始我还以为是只能交换两个值,题意理解错了,wa了几发,然后发现其实是reverse一段区间,可以用两个数组,将一个数组进行排序,与另一个数组进行比较,求出那段区间,然后将那段区间进行reverse,与排好序的数组的那一段进行比较 如果值不相同,直接输出no跑路

#include
using namespace std;const int maxn=1e5+10;int a[maxn],b[maxn];int main(){
int n; cin>>n; for(int i=1;i<=n;i++){
cin>>a[i]; b[i]=a[i]; } sort(a+1,a+1+n); int le=0,re=1; for(int i=1;i<=n;i++){
if(a[i]!=b[i]){
re=i; if(le==0) le=i; } } if(le==0) le=1; reverse(b+le,b+re+1); for(int i=le;i<=re;i++){
if(b[i]!=a[i]){
cout<<"no"<

C


题目大意

求出最大值与最小值之差 另外就是最大值与最小值的组合有多少


题解

注意一下特殊情况,那就是全都相同的时候,最大值最小值差为0 然后组合的话就是(相同数的个数*相同数的个数-1)/2 其实就是等差数列求和公式n * ( n - 1 ) / 2

#include
using namespace std;typedef long long ll;int main(){
ios::sync_with_stdio(false); cin.tie(0); ll n; cin>>n; ll x; map
mp; map
::iterator it; for(int i=1;i<=n;i++){
cin>>x; mp[x]++; } it=mp.begin(); ll a1=it->first; ll a2=it->second; it=mp.end(); it--; ll b1=it->first; ll b2=it->second; if(mp.size()==1){
cout<<0<<" "<

D


题目大意

求最大化点燃房间的时间 然后燃烧完的蜡烛b根又可以合一根


题解

先把所有的蜡烛依次点了,点完后用剩下的烛头组成新的蜡烛。。。。直到剩下的烛头不足b个,算出所有的点过的蜡烛的总数输出即可

#include
using namespace std;int main(){
ios::sync_with_stdio(false); cin.tie(0); int a,b; cin>>a>>b; int ans=a; while(a>=b){
ans+=a/b; a=a/b+a%b; } cout<
<

E


题目大意

求数组中奇偶个数为1的数组下标


题解

我承认我又刷了一个水题。。。

#include
using namespace std;const int maxn=200;int a[maxn];int main(){
ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int i=1;i<=n;i++){
cin>>a[i]; } int oo=0; int jj=0; int ido=0; int idj=0; for(int i=1;i<=n;i++){
if(a[i]&1){
jj++; idj=i; } else{
oo++; ido=i; } } if(jj==1) cout<
<
学如逆水行舟,不进则退

转载地址:https://chocolate.blog.csdn.net/article/details/101284444 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:2019 ACM训练计划——( 每天5题 ) 训练计划⑨
下一篇:解决VMware装上Mac后icloud无法激活 【安装QQ发现不能注册Apple ID】

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月15日 15时08分38秒