2020牛客寒假算法基础集训营2

A

做游戏

思路:剪刀石头布,对应的布剪刀石头,取最小值就行

 1 #include
 2 using namespace std;
 3 typedef long long ll;
 4 int main()
 5 {
 6     ll a,b,c,x,y,z;
 7     scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&x,&y,&z);
 8     printf("%lld\n",min(a,y)+min(b,z)+min(c,x));
 9     return 0;
10 }

B

排数字

 

思路:1.  6和1的个数小于2或者1的,不存在

           2.1的个数大于6的话,通过规律可发现个数为1的个数减一

           3.1的个数小于6的话答案就是1 的个数

 1 #include
 2 using namespace std;
 3 int main()
 4 {
 5     int n;
 6     scanf("%d",&n);
 7     string s;
 8     cin>>s;
 9     int _6=0,_1=0;
10     for(int i=0;i11     {
12         if(s[i]=='6')
13             _6++;
14         else if(s[i]=='1')
15             _1++;
16     }
17     if(_6<2||_1<1)
18         printf("0\n");
19     else
20     {
21         if(_1>=_6)
22             printf("%d\n",_6-1);
23         else 
24             printf("%d\n",_1);
25     }
26     return 0;
27 }
D

数三角

 

思路:判断任意两边之和大于第三边,这是判断是否能组成三角形,且将三边排序,两个小的平方和大于第三边的平方和就是钝角,相等的话就是直角了

 1 #include
 2 using namespace std;
 3 typedef long long  ll;
 4 const int  maxn=1000;
 5 const double eps=1e-8;
 6 const double PI=acos(-1.0);
 7 struct point
 8 {
 9     int x,y;
10 }p[maxn];
11 ll Len(point A,point B)
12 {
13     return ((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
14 }
15 int main()
16 {
17     int n;
18     scanf("%d",&n);
19     for(int i=1;i<=n;i++)
20         scanf("%d%d",&p[i].x,&p[i].y);
21     ll length[3];
22     int num=0;
23     for(int i=1;i<=n-2;i++) {
24         for (int j = i + 1; j <= n-1; j++) {
25             for (int k = j + 1; k <= n; k++) {
26                 length[0] = Len(p[i], p[j]);
27                 length[1] = Len(p[i], p[k]);
28                 length[2] = Len(p[j], p[k]);
29                 double a=sqrt(length[0]);
30                 double b=sqrt(length[1]);
31                 double c=sqrt(length[2]);
32                 if(a+b>c&&a+c>b&&b+c>a)
33                 {
34                     sort(length,length+3);
35                     if(length[0]+length[1]2])
36                         num++;
37                 }
38             }
39         }
40     }
41     printf("%d\n",num);
42     return 0;
43 }
E

做计数

思路:两边平方,那么2√(i*j)必然也是整数,那么i*j也就必然是平方数,这样就可以从i=1开始枚举,当i*i<=n结束,i*i%j==0时,j被整除,那么就满足条件

 1 #include
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=4e5+20;
 5 int main()
 6 {
 7    int n;
 8     cin>>n;
 9     ll cnt=0;
10     for(int i=1;i*i<=n;i++)
11     {
12         ll res=0;
13         for(int j=1;j<=i-1;j++)
14         {
15             if((i*i)%j==0)
16                 res++;
17         }
18         cnt+=res*2+1;
19     }
20     cout<21     return 0;
22 }
F

拿物品

思路:可以优先选择a+b最大的,这样双方拿的和最优,再把编号压入队列就行了

 1 #include
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=2e5+10;
 5 struct Po{
 6     int id,a,b;
 7 };
 8 bool cmp(Po a,Po b)
 9 {
10     return a.a+a.b>b.a+b.b;
11 }
12 queue<int>a,b;
13 int main()
14 {
15     int T;
16     scanf("%d",&T);
17     Po p[maxn];
18     for(int i=0;i19         scanf("%d",&p[i].a),p[i].id=i+1;
20     for(int j=0;j21         scanf("%d",&p[j].b);
22     sort(p,p+T,cmp);
23     for(int i=0;i24     {
25         if(i&1)
26             b.push(p[i].id);
27         else
28             a.push(p[i].id);
29     }
30     while(!a.empty())
31         printf("%d ",a.front()),a.pop();
32     printf("\n");
33     while(!b.empty())
34         printf("%d ",b.front()),b.pop();
35     printf("\n");
36     return 0;
37 }
G

判正误

思路:快速幂取余即可。。注意模,多摸几次就行了。。。

 1 #include
 2 #include
 3 #include
 4 #include
 5 #include
 6 #include
 7 #include
 8 #include
 9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 using namespace std;
17 typedef long long ll;
18 const ll mod=0x3ffff;
19 const ll NUM=10;//运算次数,Miller_Rabin算法为概率运算,误判率为2^(-NUM);
20 ll t,f[100];
21 ll quick(ll a, ll b)
22 {
23     int ans = 1;
24     while (b)
25     {  
26         if (b & 0x1)
27             ans = ans * a % mod;
28         a = a * a % mod;
29         b >>= 1;
30     }
31     return ans%mod;
32 }
33 int main()
34 {
35     int T;
36     scanf("%d",&T);
37     while(T--){
38     ll a,b,c,d,e,f,g;
39     scanf("%lld%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&e,&f,&g);
40     ll sum=(quick(a,d)+quick(b,e)+quick(c,f))%mod;
41     if(sum!=g%mod)
42         printf("No\n");
43     else
44         printf("Yes\n");
45     }
46     return 0;
47 }

 

你可能感兴趣的:(2020牛客寒假算法基础集训营2)