喵哈哈村的魔法考试 Round #5 (Div.2) ABCC2

官方题解:http://www.cnblogs.com/qscqesze/p/6516139.html

喵哈哈村的狼人杀大战(1)

喵哈哈村最近热衷于玩一个叫做狼人杀的游戏!

张小田今天她抽到的是民的身份,按照她的一贯玩法,她不会考虑发言者的发言,她只考虑站队情况。

现在是警上竞选的投票环节,现在只剩下还能当警长的两个真假预言家。

张小田认为,如果在某一天,有连续坐在一起的k个人投票给同一个人的话,那么她就认为这一局可能比较危险。

投给第一个预言家的,就记为0,投给第二个预言家的记为1,于是就可以得到一个01串。

现在张小田就交给你来判断,如果按照张小田 的逻辑来看这一局是否危险!

----

题目翻译:给你一个01串,你需要判断这个01串里面是否存在连续的相同字符的长度超过k个。

假设当前k为3,那么010101001就不危险,11101010就危险。

注意,该01串是串,而不是环。

该题包含多组测试数据。
第一行一个整数k。
第二行一个01串,s。
满足:1<=len(s)<=100,1<=k<=100

如果危险的话,输出Lose,否则输出Win

 复制
3
010101001
3
11101010
Win
Lose
解法:模拟
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<map>
 8 #include<vector>
 9 #define ll long long
10 using namespace std;
11 inline int read()
12 {
13     int x=0,f=1;
14     char ch=getchar();
15     while(ch<'0'||ch>'9')
16     {
17         if(ch=='-')f=-1;
18         ch=getchar();
19     }
20     while(ch>='0'&&ch<='9')
21     {
22         x=x*10+ch-'0';
23         ch=getchar();
24     }
25     return x*f;
26 }
27 string s;
28 int n,ans;
29 int v[50005],a[50005];
30 int best[50005];
31 int main()
32 {
33     int k;
34     while(cin>>k)
35     {
36         cin>>s;
37         int sum0=1;
38         int sum1=0;
39         int Max=-1;
40         char ans=s[0];
41         for(int i=1; i<s.length(); i++)
42         {
43             if(s[i-1]==s[i])
44             {
45                 sum0++;
46                 Max=max(Max,sum0);
47             }
48             else
49             {
50                 ans=s[i];
51                 sum0=1;
52             }
53         }
54        // cout<<max(Max,sum0)<<endl;
55         if(k>max(Max,sum0))
56         {
57             cout<<"Win"<<endl;
58         }
59         else
60         {
61             cout<<"Lose"<<endl;
62         }
63     }
64 
65     return 0;
66 }

喵哈哈村的狼人杀大战(2)

喵哈哈村最近热衷于玩一个叫做狼人杀的游戏!

星星同学今天她抽到的是狼的身份,按照她的一贯玩法,她喜欢无情的屠杀掉所有的神。

她现在已经很清楚了场上的预言家,女巫,猎人是谁。但是她唯一不知道的就是白痴这张神牌在谁的身上。于是她诈一诈她的下家——天行廖。

星星同学的逻辑是这样的:她可以考一道题给天行廖,如果天行廖能够答上来的话,那么天行廖肯定不是白痴,因为白痴是答不上题的。

这道题是这样的:

如果一个数只包含4和7的话,那么这个串就是幸运数,比如4777,774就是幸运数,而467就不是幸运数。

如果一个幸运数中包含的4和7的数量相同的话,那么这个数就是超级幸运数,比如4747就是超级幸运串,447就不是。

现在给你一个n,你需要找到一个最小的超级幸运数,并且这个超级幸运数大于等于n。

本题包含若干组测试数据。
第一行一个整数n。

满足 1<=n<=10^9

输出最小的超级幸运数,。

 复制
47
4500
47
4747
解法:暴力搜索,当然还是害怕超int,所以一次性打表出来查询
 1 #include<stdio.h>
 2 //#include<bits/stdc++.h>
 3 #include<string.h>
 4 #include<iostream>
 5 #include<math.h>
 6 #include<sstream>
 7 #include<set>
 8 #include<queue>
 9 #include<map>
10 #include<vector>
11 #include<algorithm>
12 #include<limits.h>
13 #define inf 0x7fffffff
14 #define INFL 0x7fffffffffffffff
15 #define lson l,m,rt<<1
16 #define rson m+1,r,rt<<1|1
17 #define LL long long
18 #define ULL unsigned long long
19 using namespace std;
20 LL q[10000000];
21 int cot;
22 void dfs(LL x,LL y,LL sum)
23 {
24    if(x==y&&x)
25    {
26        q[++cot] = sum;
27    }
28    if(sum>=1e18)
29    {
30        return ;
31    }
32    else
33    {
34        dfs(x+1,y,sum*10+4);
35        dfs(x,y+1,sum*10+7);
36    }
37 }
38 int main()
39 {
40     dfs(0,0,0);
41     sort(q+1,q+cot+1);
42     int t;
43     LL n;
44    // cin>>t;
45     while(cin>>n)
46     {
47 
48         int x = lower_bound(q+1,q+cot+1,n) - q ;
49         if(n > q[cot])
50           cout<<"44444444447777777777"<<endl;
51         else
52           cout<<q[x]<<endl;
53     }
54     return 0;
55 }

喵哈哈村的狼人杀大战(3)

喵哈哈村最近热衷于玩一个叫做狼人杀的游戏!

昊昊同学今天他抽到的是平民的身份,按照他的一贯玩法,他喜欢挂机,就什么事儿都不干。

于是他早早的就被推出去了。

现在他很无聊,于是他想了一道题来给自己打发时间。

定义f(x)=abs(ax^3+bx^2+cx+d),abs为绝对值符号。

给你a,b,c,d,l,r。

他想知道[l,r]这个范围内,f(x)的最大值。

题目包含多组测试数据。
第一行六个整数,a,b,c,d,l,r。
满足-10<=a,b,c,d<=10,-100<=l<=r<=100

对于每组测试诗句,输出最大值,需要保留两位小数。

 复制
1 2 3 4 5 6
310.00
解法:数据量很小,遍历一次就好了
 1 #include<stdio.h>
 2 //#include<bits/stdc++.h>
 3 #include<string.h>
 4 #include<iostream>
 5 #include<math.h>
 6 #include<sstream>
 7 #include<set>
 8 #include<queue>
 9 #include<map>
10 #include<vector>
11 #include<algorithm>
12 #include<limits.h>
13 #define inf 0x7fffffff
14 #define INFL 0x7fffffffffffffff
15 #define lson l,m,rt<<1
16 #define rson m+1,r,rt<<1|1
17 #define LL long long
18 #define ULL unsigned long long
19 using namespace std;
20 const int M = 3000500;
21 int p[400010], pNum;
22 bool f[M];
23 void Prime()
24 {
25     int i, j;
26     for(i = 2; i < M; i++) {
27         if(!f[i]) { p[pNum++] = i; }
28         for(j = 0; j < pNum && p[j] * i < M; j++ ) {
29             f[p[j]*i] = 1;
30             if(!(i%p[j]))
31                 break;
32         }
33     }
34 }
35 int main()
36 {
37   //  Prime();
38   //  cout<<p[0]<<endl;
39 
40     double a,b,c,d,l,r;
41     while(cin>>a>>b>>c>>d>>l>>r)
42     {
43         double Max=-1.0;
44         for(int i=l;i<=r;i++)
45         {
46             Max=max(abs(i*i*i*a+b*i*i+c*i+d),Max);
47         }
48         printf("%.2f
",Max);
49     }
50 
51     return 0;
52 }

喵哈哈村的狼人杀大战(4)

喵哈哈村最近热衷于玩一个叫做狼人杀的游戏!

徐元帅同学今天他抽到的是女巫的身份,按照他的一贯玩法,他喜欢一开始就把自己毒死。

于是他早早的就出去了。

他很无聊,于是出了一道题给自己玩。

他从怀里面掏出了一个数字n。

他想知道有多少组三元组(a,b,c),满足a<=b<=c,且a,b,c都是素数,而且a+b+c=n。

本题包含若干组测试数据。
每组测试数据只含有一个整数n。
1<=n<=10000

输出三元组的数量。

 复制
3
9
0
2
解法:先选出素数,然后化成a+b=n-c进行查询,不过要满足a<=b<=c,还需要保存比较一下
 1 #include<stdio.h>
 2 //#include<bits/stdc++.h>
 3 #include<string.h>
 4 #include<iostream>
 5 #include<math.h>
 6 #include<sstream>
 7 #include<set>
 8 #include<queue>
 9 #include<map>
10 #include<vector>
11 #include<algorithm>
12 #include<limits.h>
13 #define inf 0x7fffffff
14 #define INFL 0x7fffffffffffffff
15 #define lson l,m,rt<<1
16 #define rson m+1,r,rt<<1|1
17 #define LL long long
18 #define ULL unsigned long long
19 using namespace std;
20 const int M = 200000;
21 int p[M], pNum;
22 bool f[M];
23 int x[M];
24 int y[M];
25 void Prime()
26 {
27     int i, j;
28     for(i = 2; i < M; i++) {
29         if(!f[i]) { p[pNum++] = i; }
30         for(j = 0; j < pNum && p[j] * i < M; j++ ) {
31             f[p[j]*i] = 1;
32             if(!(i%p[j]))
33                 break;
34         }
35     }
36 }
37 int main()
38 {
39     Prime();
40     int n;
41     while(cin>>n)
42     {
43         //n=o;
44         memset(x,0,sizeof(x));
45         memset(y,0,sizeof(y));
46         int num=0;
47         for(int i=0;i<=2000;i++)
48         {
49             if(n>=p[i])
50             {
51                 x[n-p[i]]++;
52                 y[n-p[i]]=p[i];
53             }
54             else
55             {
56                 break;
57             }
58         }
59         for(int i=0;i<=2000;i++)
60         {
61             for(int j=i;j<=2000;j++)
62             {
63                 int ans=p[i]+p[j];
64                 if(p[j]<=y[ans])
65                 {
66                     num+=x[ans];
67                 }
68                 else if(ans>n)
69                 {
70                     break;
71                 }
72             }
73         }
74         cout<<num<<endl;
75     }
76     return 0;
77 }
原文地址:https://www.cnblogs.com/yinghualuowu/p/6516823.html