码迷,mamicode.com
首页 > 其他好文 > 详细

BestCoder Round #85(ZOJ1569尚未验证)

时间:2016-07-31 12:59:14      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

A题

子序列和啊,就要想到前缀和的差。这个转换一定要!记着!那么i到j的一段子序列和Sij%m ==  0就等价于(Sj-Si-1)%m == 0 了,那么什么意思呢?就是如果有两段前缀和%m的模是一样的,那么是不是就存在着一段子序列满足条件了,然后注意一下边边角角应该就没问题了。
因为ZOJ坏掉了,所以我尚未验证以下答案的ans是否就是满足条件的序列总数!移步ZOJ1569自行验证。

 

 1 #include <cstdio>
 2 #include <set>
 3 #include <map>
 4 #include <queue>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <cstring>
 8 using namespace std;
 9 typedef long long LL;
10 const int INF = 0x3f3f3f3f;
11 
12 int num[5000 + 50];
13 int main()
14 {
15     int t;
16     scanf("%d",&t);
17     while(t--)
18     {
19         int n,m,x,ans = 0,sum = 0;
20         memset(num,0,sizeof(num));
21         scanf("%d%d",&n,&m);
22         for(int i = 0 ; i < n; i++)
23         {
24             scanf("%d",&x);
25             sum = (sum + x) % m;
26             if(sum == 0) ans++;
27             num[ sum ]++;
28         }
29 
30         for(int i = 0; i< m; i++)
31         {
32             ans += (num[i] - 1) * num[i] / 2;
33         }
34         if(ans != 0)
35             printf("YES\n");
36         else
37             printf("NO\n");
38     }
39 
40     return 0;
41 }

 

 

 

B题(思路)

这个应该算是个贪心。真尼玛= =,脑洞题。

我也不知道怎么讲比较好,自己拿个笔和纸琢磨一下,应该就搞懂了,网上那些题解说的感觉也不好。还是要拿笔,照这个程序,手动模拟一下,应该就能搞懂了。

 

 1 #include <cstdio>
 2 #include <set>
 3 #include <map>
 4 #include <queue>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <cstring>
 8 using namespace std;
 9 typedef long long LL;
10 typedef long long LL;
11 const int INF = 0x3f3f3f3f;
12 const int maxn = 100050;
13 int a[maxn];
14 int main()
15 {
16     int t,n,m;
17     scanf("%d", &t);
18     while(t--)
19     {
20         scanf("%d%d", &n, &m);
21         for(int i = 0; i < n - 1; i++)
22             scanf("%d", &a[i]);
23         sort(a, a + n - 1);
24         LL ans = n;
25         for(int i = 0; i< n - m; i++)
26             ans += a[i];
27         printf("%I64d\n", ans);
28     }
29     return 0;
30 }

 

 

 

C题

这题竟然是交一暴力就能A了。。我也是醉了啊。

学个小姿势:素数定理:技术分享

也就是说1到n以内的素数个数大概是O(sqrt(x) * ln x)个

那么就可以看出这道题,枚举暴力的时间复杂度,其实就是对n=sqrt(x),的前后的一些素数进行枚举嘛,所以最多和1到sqrt(x)范围内的素数个数差不多?所以暴力的时间复杂度O(n4logn2\sqrt[4]{n}log\sqrt[2]{n},所以能直接枚举。

素数,总是要注意一些比2小的数的情况。这道题里面还有什么,是不是正数啊,有没有加LL啊,巴拉巴拉啦。打高亮了。

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef long long LL;
 7 const LL INF = 0x3f3f3f3f3f3f3f3fll;
 8 LL x,z,ans;
 9 bool judge(LL t)
10 {
11     if(t < 2) return false;
12     LL temp = t;
13     for(LL i = 2; i * i <= temp; i++)
14     {
15         if(temp % i == 0)
16         {
17             if(temp % (i * i) == 0)
18                 return false;
19             temp /= i;
20         }
21     }
22     ans = min(ans,abs(t * t - x));
23     return true;
24 }
25 void solve()
26 {
27     int flag = 0;
28     LL z = sqrt(x);
29     if(z * z < x) z++;
30     for(LL i = max(z,2LL);;i++)
31     {
32         if(judge(i))
33             break;
34     }
35     for(LL i=z-1;i>1;i--)
36     {
37         if(judge(i))
38             break;
39     }
40 
41 }
42 int main()
43 {
44     int T;
45     scanf("%d",&T);
46     while(T--)
47     {
48         scanf("%I64d", &x);
49         ans = INF;
50         solve();
51         printf("%I64d\n",ans);
52     }
53     return 0;
54 }

 

?4???n???log?2???n???)

BestCoder Round #85(ZOJ1569尚未验证)

标签:

原文地址:http://www.cnblogs.com/luosuo10/p/5722759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!