2017年浙江理工大学程序设计竞赛校赛 题解&源码(A.水, D. 简单贪心 ,E.数论,I 暴力)
Problem A: 回文
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1719 Solved: 528Description
Input
Output
Sample Input
5 abA gg Codeforces acmermca myacm
Sample Output
NO NO NO YES YES
HINT
题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?cid=3648&pid=0
分析:这题好水好水,只要当字符串的长度大于等于3,第一项和最后一项相等就输出YES,否则输出NO,字符串长度小于等于2,一定输出NO
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int T; 6 char s[50010]; 7 while(scanf("%d",&T)!=EOF) 8 { 9 while(T--) 10 { 11 scanf("%s",s); 12 int len=strlen(s); 13 if(len==1||len==2) 14 printf("NO\n"); 15 else 16 { 17 if(s[0]==s[len-1]) 18 printf("YES\n"); 19 else printf("NO\n"); 20 } 21 } 22 } 23 return 0; 24 }
Problem B: RPG的地图
Time Limit: 3 Sec Memory Limit: 128 MB Submit: 103 Solved: 4Description
Input
Output
Sample Input
6 3 4 0 3 3 0 3 -2 0 0 -3 3 -3 0 0 4 1 -1 2
Sample Output
Yes No No
HINT
题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?cid=3648&pid=1
分析:好吧,我没做出来!
Problem C: 国王的命令
Time Limit: 7 Sec Memory Limit: 128 MB Submit: 75 Solved: 10Description
A国有n个城市,非常巧合的是这n个城市刚好构成了一棵树。A国的国王是位日理千机的贤君,为了能及时发布自己的命令,于是决定在每个城市都建造一个信号塔,信号塔能传播信息,城市i的信号塔的传播能力是val(i): 表示如果城市i和城市j的dist(i,j) <= val(i),那么就能把信息从城市i传到城市j(注意能否把信息从城市j传到城市i, 则要满足dist(i,j) <=val(j))。国王所在的城市为1号城市,国王想尽可能快的让自己发布的命令在i号城市被执行,所以他希望把命令从1号城市传播到i号城市这个过程中的传播次数尽可能少,如图:
Input
Output
Sample Input
8 1 3 1 1 1 1 1 1 1 2 1 3 1 4 2 5 2 6 3 7 3 8
Sample Output
1 1 1 2 2 2 2
HINT
Problem D: 买iphone
Time Limit: 3 Sec Memory Limit: 128 MB Submit: 1855 Solved: 348Description
Input
Output
Sample Input
10 3 3 3 4 20 7 1 1 1 80 3 100 3 3 15 4 3 5 6
Sample Output
Yes No No Yes
HINT
没想到这个题纯暴力就能过了,当然了不是k^2级别的。一共有k个人去装手机,假设有x个人装a,y(y小于k-x)个人装b,剩下的人装c,只要判断出x*a+y*b+(k-x-y)*c==n的情况就可以了
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n,k,a,b,c; 6 int flag; 7 while(scanf("%d%d%d%d%d",&n,&k,&a,&b,&c)!=EOF) 8 { 9 flag=0; 10 for(int i=0;i<=k;i++) 11 { 12 for(int j=0;j<=k-i;j++) 13 { 14 if(i*a+j*b+(k-i-j)*c==n) 15 { 16 flag=1; 17 break; 18 } 19 if(flag) 20 break; 21 } 22 } 23 if(flag)printf("Yes\n"); 24 else printf("No\n"); 25 } 26 return 0; 27 }
Problem E: 同源数
Time Limit: 3 Sec Memory Limit: 128 MB Submit: 1344 Solved: 244Description
Input
Output
Sample Input
18 12 2 3
Sample Output
Yes No
HINT
题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?cid=3648&pid=4
这个题是分析的时间最长的一个题了,最后想出解法后还因为没考虑到全面的情况,又花了很长的时间。首先读完题目的第一反应就是唯一分解定理,然后就卡壳了。突然想到了gcd(),就在纸上分析了一下,慢慢的才ac的。
同源数,也就是他们的质因子的元素是相同的(个数不一定相同)。假如a=2*3*3*5*7,b=2*2*3*5*5*7,他们两个是同源数,对a,b求gcd(a,b)=g;显然g分解后质因子一定包含他们共有的质因子,即2*3*5*7,然后a,b都除以他们的质因子,如果两个数是同源数的话,那么让a一直除以a和g的gcd(),a=a/gcd(a,g),直到a==1或gcd(g,a)为止,如果a==1的说说明了a的质因子只包含了和g相同的质因子,如果a!=1&&gcd(a,g)==1的话,说明a和g互素,也就是a中的质因子有和g中的质因子不同的元素。同理对b也这样处理。如果a==1&&b==1的话说明是同源数,否则不是。
特殊处理a==b和a==1||b==1的情况。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll gcd(ll a,ll b) 5 { 6 return b==0?a:gcd(b,a%b); 7 } 8 int main() 9 { 10 ll a,b; 11 while(scanf("%lld%lld",&a,&b)!=EOF) 12 { 13 if(a==b) 14 printf("Yes\n"); 15 else if(a!=1&&b==1) 16 printf("No\n"); 17 else if(a==1&&b!=1) 18 printf("No\n"); 19 else 20 { 21 ll t=gcd(a,b); 22 ll m=a/t; 23 ll n=b/t; 24 ll mm=1,nn=1; 25 while(1) 26 { 27 ll k=gcd(m,t); 28 m=m/k; 29 if(m==1) 30 break; 31 else if(k==1) 32 { 33 mm=0; 34 break; 35 } 36 } 37 while(1) 38 { 39 ll k=gcd(n,t); 40 n=n/k; 41 if(n==1) 42 break; 43 else if(k==1) 44 { 45 nn=0; 46 break; 47 } 48 } 49 if(mm&&nn) 50 printf("Yes\n"); 51 else printf("No\n"); 52 } 53 } 54 return 0; 55 }
Problem F: 垃圾生成器
Time Limit: 2 Sec Memory Limit: 128 MB Submit: 89 Solved: 19Description
Input
Output
Sample Input
3 2 4 2
Sample Output
1.00000 1.66667
HINT
题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?cid=3648&pid=5
Problem G: 最佳淘汰算法
Time Limit: 12 Sec Memory Limit: 128 MB Submit: 366 Solved: 53Description
提出最佳页面淘汰算法。是操作系统存储管理中的一种全局页面替换策略当要调入一页而必须淘汰旧页时,应该淘汰以后不再访问的页,或距现在最长时间后要访问的页面。它所产生的缺页数最少,然而,却需要预测程序的页面引用串,这是无法预知的,不可能对程序的运行过程做出精确的断言。但是我们在这里会告诉你一个已经存在的一个页面序列,请输出最终在内存中存在的页面即可。
Input
有多组数据(组数<=21)。
每组数据输入形如:
n m
a1 a2 a3 a4 .... an
其中n(n,m<=500000)表示已知页面序列的长度。
ai(0<=ai<=100000)表示页面类型,为整数。
m为在内存中保存的页面类型数量。
Output
输出形如:
b1 b2 b3 .... bk
具体要求请仔细阅读样例和Hint。
Sample Input
21 3 7 0 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1 3 2 2 1 3 4 3 1 0 0 1
Sample Output
7 0 1 3 1 1 0
HINT
第一个样例:
访问页面7,当前内存中页面数为0,没有达到3页,放入7,当前内存中的页面为(7)
访问页面0,当前内存中页面数为1,没有达到3页,放入0,当前内存中的页面为(7,0)
访问页面0,已经在内存中存在,不做任何操作,当前内存中的页面为(7,0)。
访问页面1,当前内存中页面数为2,没有达到3页,放入1,当前内存中的页面为(7,0,1)。
访问页面2,内存中页数已经达到3页,开始淘汰页面。我们发现在内存中的7下次出现的位置为19, 0为6,1为15,所以7是最长时间后才要访问的,所以7被淘汰。
现在内存中的三个页面变为(2,0,1)。
访问页面0,我们发现0已经存在于我们的内存中,于是我们不做任何如理,继续访问下一个页面。以此类推。
注意如果在某次插入时,在内存中有多种页面在淘汰后不会再被访问,那么我们这次淘汰页面类型号最大的,请看第二个样例。
题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?cid=3648&pid=6
Problem H: 玩具
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 795 Solved: 162Description
Input
Output
Sample Input
3 5 14 1 2 3 4 5 5 4 3 2 1 3 1 100 1000 10000 100 1000 10000 1 0 1000000 1000000
Sample Output
15 10000 1000000
HINT
Problem I: 约素
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1876 Solved: 489Description
Input
第一行给测试总数T(T <= 10000)。
接下来有T行,每行有两个数字n(1 <= n <= 1000000000)和p(2 < p <= 1000000000)。Output
每组测试数据输出一行,如果n的约数个数是p,输出“YES”,否则输出“NO”。
Sample Input
5 64 7 911 233 1080 13 1024 11 20170211 1913
Sample Output
YES NO NO YES NO
HINT
题解:暴力求约数,常规技巧简化
约数,我都想问到底什么叫做约数。以前做的计算约数的个数的理解记得不是这样的来。这个题的约数就是让你暴力找一遍n%i==0时i的个数。而紫书上的约数的个数是表示质因子的个数相乘得来的。
当然这个也不能1-n暴力,因为对于n%x==0的话,也就得出了另一个约数:y=n/x,既然是约数,x,y都是小于n的,那么x从1开始一直到,n/x就可以了,此时当x增大的时候,n/x就在减小。知道x>=n/x.特别处理,当x==n/x的时候约数的个数+1,否则+2(x和n/x都是n的约数)
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int T; 6 int n,m; 7 while(scanf("%d",&T)!=EOF) 8 { 9 while(T--) 10 { 11 scanf("%d%d",&n,&m); 12 int sum=0; 13 for(int i=1;i<=n/i;i++) 14 { 15 if(n%i==0) 16 { 17 sum++; 18 if(i!=n/i) 19 sum++; 20 } 21 } 22 if(sum==m) 23 printf("YES\n"); 24 else printf("NO\n"); 25 } 26 } 27 return 0; 28 }
作 者:Angel_Kitty
出 处:https://www.cnblogs.com/ECJTUACM-873284962/
关于作者:阿里云ACE,目前主要研究方向是Web安全漏洞以及反序列化。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
欢迎大家关注我的微信公众号IT老实人(IThonest),如果您觉得文章对您有很大的帮助,您可以考虑赏博主一杯咖啡以资鼓励,您的肯定将是我最大的动力。thx.
我的公众号是IT老实人(IThonest),一个有故事的公众号,欢迎大家来这里讨论,共同进步,不断学习才能不断进步。扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码),个人QQ和微信的二维码也已给出,扫描下面👇的二维码一起来讨论吧!!!
欢迎大家关注我的Github,一些文章的备份和平常做的一些项目会存放在这里。