A.约数个数

p^q表示p的q次方,正整数M可以分解为M=(p1^a1)*(p2^a2)*(p3^a3)*……*(pn^an)的形式,其中p1,p2……pn为质数(大于1并且只能被1和自身整除的数叫做质数)。a1,a2……an为整数。例如18=(2^1)*(3^2),45=(3^2)*(5^1)。

给出n和一个质数g,以及正整数M分解后的形式,求M的所有约数中,有多少能被g整除。

第一反应是不是求出M然后找因数?那你就上当了,M可能很大很大的呢U•ェ•*U,这个题要注意pi是质数,并且g也是质数,所以如果,pi中没有g的话,M一定不会被g整除了,当pi里有g的时候就要看有多少个了,废话少说,举例最清晰了,上图(字丑再加上不知道为什么图片竟然变形了,将就看看不要嫌弃ε=ε=ε=(~ ̄▽ ̄)~)

可能推的公式有些不好理解,我再来补个图

好了,上代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100],b[100];
int main()
{cin>>n>>m;int flag=0;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]==m) //如果存在ai==m{flag=i; //标记一下是第几个数}}for(int i=1;i<=n;i++){cin>>b[i]; //bi是幂数}long long num=b[flag]; //g的幂数for(int i=1;i<=n;i++){if(i!=flag)num+=num*b[i]; //上图推导出来的个数}if(!flag) //不存在直接为0{cout<<"0"<<endl;}elsecout<<num<<endl;
}

B.  Alice and Bob

Alice and Bob decide to play a game. At the beginning of the game they put n piles of sweets on the table.The number of each pile of sweets may be different. Alice and Bob take away sweets in turn,and always Alice takes sweets first in every games.Each time in their turn they can get only one whole pile of sweets.When there is no sweet left, the game is over. Finally, The man who have the largest number of sweets in hand will win.
Assume that Alice and Bob were very clever.

这个题大意就是有好多堆糖还是甜点(大雾,Alice先拿,Bob后拿,谁拿的多谁赢,这其实是一个小博弈题,看好多人都模拟去做了23333,因为先拿的总会拿最多的那一堆,所以Alice尽最大可能去赢。可以先分奇数堆和偶数堆,如果是奇数堆的话,肯定是Alice赢,如果是偶数堆的话,还要去看是否是均分的,如果是均分的,那就平局,如果不是均分的肯定是Alice赢。

好,我们来看代码

#include<bits/stdc++.h>
using namespace std;
int n;
int a[10005];
int main()
{scanf("%d",&n);int k;for(int i=0;i<n;i++){scanf("%d",&k);a[k]++;//我这里使用的桶来记录是否均分//如果桶全是偶数次就是均分,存在一个奇数次就不是均分}if(n&1)//奇数堆,相当于n%2{printf("A\n");return 0;}else//偶数堆{for(int i=1;i<=1000;i++){if(a[i]&1)//存在奇数桶,不均分{printf("A\n");return 0;}}printf("again\n");//均分}
}

C. 黑白黑

黑白黑是一个很经典的游戏,规则也非常简单。三个人同时伸出一只手,手心为白,手背为黑,如果有两人为黑一人为白,或者两人为白一人为黑,则单独伸出手心或者手背的那个人就输了。
又是一个周末,小A小B小C他们仨个懒虫又睡到了中午,外卖送到楼下了也不想下楼拿,于是他们决定用这个游戏来选出一个输的人去拿外卖。

只需要判断 是不是两个相同的和一个不同的即可

#include <bits/stdc++.h>
using namespace std;
int a, b, c;
int main()
{cin >> a >> b >> c;if (a == b && b == c)cout << "aha";else if (a == b)cout << "C";else if (b == c)cout << "A";else if (a == c)cout << "B";return 0;
}

D. GPA

期末考试成绩终于出来了,小杜怀着忐忑的心情查了一下自己的成绩,还好7门课程都没有挂科。
不过教务系统出故障了,唯独不显示小杜的平均绩点,但是小杜这种学渣又不会算,你能帮他计算一下吗?

成绩            绩点
91-100           4.0
86-90             3.5
81-85             3.0
76-80             2.5
71-75             2.0
66-70             1.5
60-65             1.0
60以下             0
平均绩点:(课程学分1*绩点+课程学分2*绩点+~~~+课程学分n*绩点)/(课程学分1+课程学分2+~~~+课程学分n)

小杜也要去好好学习啦,我们更要努力啦,小杜加油哦 (ง •̀_•́)ง

根据成绩段乘不同绩点和再除以总学分就阔以啦,注意输出两位小数(我也想要高绩点,哭唧唧(;´ ༎ຶ Д ༎ຶ `))

#include<bits/stdc++.h>
using namespace std;
int a[8],b[8];
int main()
{for(int i=0;i<7;i++)cin>>a[i];int num=0;for(int i=0;i<7;i++){cin>>b[i];num+=b[i];}double sum=0;for(int i=0;i<7;i++){if(a[i]>=91)sum+=1.0*b[i]*4.0;else if(a[i]>=86&&a[i]<=90)sum+=1.0*3.5*b[i];else if(a[i]>=81&&a[i]<=85)sum+=1.0*3.0*b[i];else if(a[i]>=76&&a[i]<=80)sum+=1.0*2.5*b[i];else if(a[i]>=71&&a[i]<=75)sum+=1.0*2.0*b[i];else if(a[i]>=66&&a[i]<=70)sum+=1.0*1.5*b[i];else if(a[i]>=60&&a[i]<=65)sum+=1.0*1.0*b[i];}printf("%.2f\n",sum/num);
}

E.are you ok?

小朋是一家超市的老板,他经常会来超市检查,每次都会让仓库管理员列出仓库中剩余商品的数量。但是仓库管理员是个非常健忘的人,有时候商品都卖光了也不去进货,这会让老板非常生气,因为这样超市卖不出去东西就没办法赚钱了。小朋有句口头禅"are you ok?",如果发现所有商品的库存都为0的话,就会非常生气地喊出"are you ok?",大声地质询仓库管理员。 
现在你就是仓库管理员,每次面对小朋的询问,你都会在电脑系统中对库存进行查询,然后列出剩余商品的清单。(如果所有商品库存都是0,那你就没办法交差了,你的老板会非常生气)。

为什么第一反应是亲爱的雷军先生的鬼畜呢,are you ok φ(゜▽゜*)♪

判断一下是否全为0,不全为0 就输出货物名字 x 个数

#include<bits/stdc++.h>
using namespace std;
string s[1005];
int a[1005],No[1005];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>s[i];}int num=0;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]){No[num++]=i;//为了省for循环//就开了数组从0位置开始不为0的填货物的序号}}if(No[0]==0)//一个也没有 即全为0cout<<"are you ok?";else{for(int i=0;i<num;i++){cout<<s[No[i]]<<" x "<<a[No[i]]<<endl;}}}

F. 折纸达人

小明最近对折纸很感兴趣,他想知道一张正方形的纸在多次折叠以后沿纸的中线用剪刀将其剪开能得到多少张纸?

输入

第一行一个整数t,表示一共有t组数据(1 <= t <= 100)
每组输入数据包括三行
第一行为一个整数n,表示有n次操作(1 <= n <= 10^5)
第二行为n个大写字母(四种情况L,R,T,B     L表示从左向右折 R表示从右向左折 T表示从上向下折 B表示从下向上折)
第三行为两个字母(四种情况 LR,RL,TB,BT    LR表示从左向右剪 RL表示从右向左剪 TB表示从上往下剪 BT表示从下往上剪)

输出

输出一个整数表示能得到的纸的数目
答案可能过大 需要对1000000007 (1e9+7)取模

这个题是不是感觉有点难度了,其实就是找规律的难度,我也是拿了张纸模拟折叠找出来的规律,别的办法暂时还没想到,可能是我太笨了d=====( ̄▽ ̄*)b,其实多模拟几次就会发现,左右方向剪只对上下方向叠有贡献,上下方向剪只对左右方向叠有贡献,所有就可以对应一下怎样剪的,然后只算另一个方向叠所形成的数量,然后也是多模拟几次会发现数量是2^k+1,k是折叠数,所以还是要动手鸭,突然想起来那些不拿纸笔就来参赛的人是认真的?233333.....

#include<bits/stdc++.h>
using namespace std;
const long long Mod=1000000007;
char zhe[100005];
string jian;
int t,n;
int LR,TB;
int main()
{scanf("%d",&t);while(t--){scanf("%d",&n);LR=0;TB=0;for(int i=0;i<n;i++){cin>>zhe[i];if(zhe[i]=='R'||zhe[i]=='L'){LR++;//左右方向折叠次数}else{TB++;//上下方向折叠次数}}cin>>jian;long long num=1;if(jian=="LR"||jian=="RL")//左右方向剪{for(int i=1;i<=TB;i++){num=num*2%Mod;}num+=1;cout<<num<<endl;}else //上下方向剪{for(int i=1;i<=LR;i++){num=num*2%Mod;}num+=1;cout<<num<<endl;}}
}

G. 数数

小凯今年上一年级了,他只学会了0-9这十个数字,对于两位以上的数字,小凯自创了一套读法。
连续出现的x个y,小凯将其读作“xy” 
比如:11  小凯读作"21"    (连续2个1)
     21  小凯读作"1211"  (连续1个2 连续1个1)
     99  小凯读作"29"    (连续2个9)
     310 小凯读作"131110"(连续1个3 连续1个1 连续1个0)
     330111 小凯读作"231031"(连续2个3 连续1个0 连续3个1)
     给定一个由数字组成的字符串n(2 <= |n| <= 100),请输出小凯对n的读法
     |n|表示字符串n的长度
     保证连续出现同一个数字的次数不会超过9次(因为小凯最多只能数到9)
     比如:2223311111111118(非法,因为数字1连续出现了10次)

这个小凯是认真的嘛,难道是...刘凯小朋友?
数组扫一遍用Count计数判断有多少个就ok惹...

#include<bits/stdc++.h>
using namespace std;
string s;
int Count=0;int main()
{cin>>s;Count=1;//第一个数字的for(int i=1;i<s.length();i++){if(s[i]==s[i-1])//前后相同{Count++;}else//前后不同了 重新开始{cout<<Count<<s[i-1];Count=1;}if(i==s.length()-1&&Count)//特判,如果全是一个数字 {cout<<Count<<s[i];}}
}

H.神奇老虎机

不知道你有没有玩过老虎机,现在小明面前有一台神奇的老虎机,这台机器有n个滚轮,从左往右数第i个滚轮包含1到a_i的整数(包括1和a_i)。在按下按钮之后,所有的滚轮都会飞速旋转,最终停下来,每个滚轮将显示其中一个整数。这个过程是随机的。小明有一个有趣的想法,如果将滚轮显示的数字连接起来看做一长串字符串的话,将会有非常多的可能,在这所有的可能中字典序最小的字符串是哪个?(只能从左向右读)

对于字典序的说明:
两个字符串S和T,从前往后比较,如果存在一个位置,在该位置两个字符串的字符不同,则比较小的那个所在的字符串字典序更小。
例如: 123的字典序比14的小,因为在第二个位置上2小于4
     12345的字典序比9的小
     220的字典序比22的大,因为22是220的一个前缀

输入

一个整数t,表示有t组数据(1 <= t <= 100)
每组第一行为一个整数n表示老虎机有n个滚轮
(1 <= n <= 1000)
第二行为n个整数(a_1 a_2 ... a_i ... a_n )
表示第i个滚轮上的数字范围(1~a_i)
(1 <= a_i <= 100)

输出

每组输入对应一行输出,输出字典序最小时老虎机滚轮上显示的数字
两个数字之间用空格隔开

这个题有两个大坑点,刚开始一不留神就掉进去,差点爬出出来(疯狂哭 ( ఠൠఠ )ノ

首先是100101的字典序比111111小,但是范围中没有0鸭,咋还会出来0呢,没有0但可以有10!!!可以有100!!!(咆哮!! 所以第一个坑点在这,要判断一下是否可以取到100,10,还有最后一位因为22是220的前缀,所以字典序小,因为最后一位就不要去挑逗100和10惹,老老实实输入1就行了,第二大坑点,输出描述有问题啦,怪凉心出题人,是每个数之间用空格,不是每个数字鸭!!(再次咆哮!!

#include<bits/stdc++.h>
using namespace std;
int n;
int t;
int a;
int main()
{cin>>t;while(t--){cin>>n;for(int i=1;i<n;i++){cin>>a;if(a==100){printf("100 ");}else if(a<10){printf("1 ");}else{printf("10 ");}}cin>>a;printf("1 \n");}
}

 I.五环

奥运五环由蓝、黄、黑、绿、红五种颜色的圆环组成。
小迪认为五个圆环分别代表五大洲:
蓝色 = 欧洲
黄色 = 亚洲
黑色 = 非洲
绿色 = 大洋州
红色 = 美洲
对应英文为
Blue = Europe
Yellow = Asia
Black = Africa
Green = Oceania
Red = America

输入

输入一行字符串
字符串为五环的颜色或者五个大洲的名称

输出

如果输入的是颜色则输出对应的大洲
如果输入的是大洲则输出对应的颜色

啊~五环~~你比四环多一环~~~,你比六环少一环~~~

if 无脑判断英文字符串对应就可以了

#include<bits/stdc++.h>
using namespace std;
int main()
{string s;cin>>s;if(s=="Blue")cout<<"Europe";else if(s=="Yellow")cout<<"Asia";else if(s=="Black")cout<<"Africa";else if(s=="Green")cout<<"Oceania";else if(s=="Red")cout<<"America";else if(s=="Europe")cout<<"Blue";else if(s=="Asia")cout<<"Yellow";else if(s=="Africa")cout<<"Black";else if(s=="Oceania")cout<<"Green";elsecout<<"Red";
}

J.小洋的外挂

最近小洋迷上了一款名叫打地鼠的游戏,但是小洋是个游戏白痴,这么简单的游戏也总是得不到几分,有一天他发现这款游戏可以在网络上买到外挂,这款外挂可以提前预知所有地鼠出现的时间,并且他可以开局得到两把锤子,之前小洋1s只能挥动一次锤子,现在他左右开弓可以同时打中最多两只地鼠。每只地鼠在第i秒出现,在第i+1秒的时候就会消失。也就是说在第i秒小洋只能打到这一秒出现的地鼠,(i-1)秒以及(i+1)秒出现的地鼠他都没办法打中。

每秒钟最多打两个,数组扫一遍如果某秒钟大于两个就只记录两个,一个的话...当然全都要啦

#include<bits/stdc++.h>
using namespace std;
int a[10005];
int n,m;
int main()
{cin>>n>>m;int t;int num=0;for(int i=0;i<n;i++){cin>>t;a[t]++;if(a[t]>2)continue;elsenum++;}cout<<num<<endl;
}

 K.数字匹配

给出两个元素数量都为n的数组a和数组b。对于数组a中的每个元素,都必须找一个(而且最多一个)数组b中的元素进行匹配,数组b中的所有元素也都要被匹配到,也就是说一一匹配。匹配完成后,相互匹配的元素相乘,然后把所有的积相加。

例如:

数组a:1 5 3

数组 b:2 3 4

如果a中第一个元素跟b中第三个元素匹配,第二个元素跟b中第二个元素匹配,第三个元素跟b中第一个元素匹配,匹配完后相乘得到 1*4、5*3、3*2,求和得到结果1*4+5*3+3*2=25。

如果a中第一个元素跟b中第二个元素匹配,第二个元素跟b中第三个元素匹配,第三个元素跟b中第一个元素匹配,匹配完后相乘得到 1*3、5*4、3*2,求和得到结果1*3+5*4+3*2=29。

给出n和两个数组,分别计算求和的最大结果与最小结果。

贪心求最大值最小值,经过我小小的不严谨的证明,最后结论是最大值乘最大值对总体的贡献才最大,同理最小值

不严谨的图片献上(真的搞不懂为啥不能等比例放图片,显得我的字真丑╰(‵□′)╯

#include<bits/stdc++.h>
using namespace std;
int a[1005],b[1005];
int n;
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);//从小到大排序for(int i=1;i<=n;i++){cin>>b[i];}sort(b+1,b+n+1);long long num1=0,num2=0;for(int i=1;i<=n;i++){num1+=a[i]*b[i];//最大乘最大,最小乘最小 最大值num2+=a[i]*b[n-i+1];//最大乘最小 最小值}printf("%lld %lld",num1,num2);}

L.寄蒜几盒 

现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 
这若干个点在圆圈上按顺时针顺序分布。 
如果可以的话输出"Yes"(不含引号)
不可以的话输出"No"(不含引号)

输入

第一行一个整数n,表示圆圈上有n个点
第二行n个整数,分别表示第1个点与第2个点之间圆弧的长度、第2个点与第3个点之间圆弧的长度······第n个点与第1个点之间圆弧的长度
3 <= n <= 10^6
1 <= x_i <= 1000 ( 1 <= i <= n)

我和继朋小朋友有两种不同解法,一个模拟查找+优化,一个利用二分查找,等会找他写一下二分的题解

方法一:弦长相等的话,那么对应的弧也相等,所以周长一定是3的倍数。因为给的是与前面一个点的距离,所以我们可以前缀和求周长,要想构成等边三角形那么三个点之间两两相距d=周长/3,怎么求两个不同点之间的距离呢?别忘了 给出的是前一个点与后一个点之间相隔的距离,那么,就可以利用区间和求两点之间的距离。优化一利用1/3周长和2/3周长做判断点,判断是否能够继续找,优化二 如果两个点相隔1/3周长,但找不到第三个点,这时候这两个点是不可能组成等边三角形了,所以有的话可以记录一下,然后跳过

看我挫挫的代码

#include<bits/stdc++.h>
using namespace std;
int n;
int d[1000005];
bool vis[100005];
int main()
{cin>>n;int sum=0;for(int i=1;i<=n;i++){cin>>d[i];sum+=d[i];}if(sum%3){printf("No\n");return 0;}else{int flag1=0,flag2=0,flag3=0;int s;for(int i=1;i<=n;i++){if(vis[i]){continue;}s=0;flag2=0;//第一个距离d的点 flag3=0;//第二个for(int j=i;j<=n;j++){s += d[j];  //区间和 求长度if(s==sum/3)//第一个点找到{flag2=j;vis[j]=1;}if(s>sum/3&&(!flag2))//弧长>1/3没找到第一个点{break;}if(s==sum/3*2&&flag2)//第二个点找到{flag3=1;printf("Yes\n");return 0;}if(s>sum/3*2&&(!flag3))//弧长>2/3没找到第二个点{break;}}}printf("No\n");}
}

方法二

二分

继朋博客献上https://www.cnblogs.com/violet-acmer/p/10020199.html

M.签到题

恭喜你发现一道签到题,请输出“check in”来解决这道问题。

#include<bits/stdc++.h>
using namespace std;
int main()
{cout<<"check in";
}

QLU ACM2018新生赛相关推荐

  1. QLU ACM 2018新生赛解题报告

    QLU ACM 2018 新生赛解题报告 A [1303]约数个数 题目描述 输入 输出 解析 B [1301]Alice and Bob 题目描述 输入 解析 C [1289] 黑白黑 题目描述 输 ...

  2. [SUCTF2018]babyre [ACTF新生赛2020]fungame

    文章目录 [SUCTF2018]babyre 惯用思维 常人思维 GAMEOVER [ACTF新生赛2020]fungame int __cdecl sub_401340(int a1) int __ ...

  3. BUUCTF Web [ACTF2020 新生赛]Exec

    「作者主页」:士别三日wyx   此文章已录入专栏<网络攻防>,持续更新热门靶场的通关教程 「未知攻,焉知收」,在一个个孤独的夜晚,你完成了几百个攻防实验,回过头来才发现,已经击败了百分之 ...

  4. BUUCTF Web [ACTF2020 新生赛]Include

    「作者主页」:士别三日wyx   此文章已录入专栏<网络攻防>,持续更新热门靶场的通关教程 「未知攻,焉知收」,在一个个孤独的夜晚,你完成了几百个攻防实验,回过头来才发现,已经击败了百分之 ...

  5. 小乐乐与二段数(2019哈理工新生赛第20题)

    链接:2019哈理工新生赛题解 2019哈理工新生赛第20题 T题: 链接:https://ac.nowcoder.com/acm/contest/1877/T 来源:牛客网 题目描述 小乐乐从老师口 ...

  6. 2019年安徽大学ACM/ICPC实验室新生赛题解

    本文仅作个人收藏学习使用 题目及解析来源牛客竞赛网 //作者:王清楚 //链接:https://ac.nowcoder.com/discuss/351408?type=101&order=0& ...

  7. CTF新生赛之Writeup

    CTF新生赛之Writeup 作为零基础的新生,也是在开学后才了解了CTF,感觉本次新生赛中颇有收获,也是应赛制要求,故写下这份WP,以纪念本人的第一次CTF竞赛. 回顾和感想 回顾本次的新生赛,难度 ...

  8. XUPT 新生赛题目总结

    XUPT 新生赛题目总结 题目 永远的王聪明王 菊花侠大战桃花怪 教官喊话 Time Management 小布特烦恼 菜学长的糖糖 水题 永远的王聪明王 简单的结构体排序,唯一要注意的是数据范围(时 ...

  9. 论如何举办一个承载400人的比赛(XUPT新生赛承办小记)

    XUPT新生赛承办小记 老师去年就想搞一个新生赛了,奈何去年时间不够,没有搞,于是今年就开始提前搞起来了.ZLS说要不然搞一个domjudge,我寻思着好鸭好鸭,看起来很牛逼,然后就开始了苦逼的配环境 ...

最新文章

  1. deeplearning搜索空间
  2. PCL1.8.0+VS2013+Win10 x64的配置教程
  3. leetcode算法题--二叉树的锯齿型层次遍历
  4. IaaS,PaaS,SaaS 的区别
  5. c++ primer 5th 笔记:第二章
  6. python3参考秘籍-附PDF下载
  7. Troubleshooting OpenStack Bug- 每天5分钟玩转 OpenStack(162)
  8. oracle10g的rat模拟,Oracle 10g Logminer 研究及测试
  9. python企业级框架_Python六大开源框架对比:Web2py略胜一筹(转)
  10. 数据结构之 普利姆算法总结
  11. 行为型模式——模板方法模式
  12. graphpad两组t检验_如何用 GraphPad prism进行 t 检验?
  13. 《紫川》之远东战火 第八卷
  14. Unity 5如何设置物体透明
  15. 几个必须知道的Python工具
  16. android 连接不上手机,安卓手机连接不上电脑怎么办
  17. Cesium 填挖方分析
  18. 使用Springboot实现Nginx均衡负载功能
  19. 个人站长怎么兼职赚钱
  20. Git命令: rebase 和 squash命令

热门文章

  1. 3个月学习成功上岗软件测试,我一个文科女也能吃IT饭了...
  2. 给在读研究生未来要读研同学们的一封受益匪浅的信
  3. Electron + Vue 实现输入法自动刷字数
  4. 超级内存NVDIMM
  5. 剪辑视频的软件怎么二次剪辑才算原创
  6. 手机PDF如何转图片格式
  7. windows主机如何登录阿里云服务器
  8. Hive基础之创建数据库
  9. 互联网周刊:Web 3.0还有多远
  10. 36周岁这年,我终于知道该怎么活了!