其他分享
首页 > 其他分享> > 1.28训练

1.28训练

作者:互联网

A.CodeForces - 994A 

题意:直接翻译

思路:直接遍历输出即可

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int main(){
 8     int n,m;
 9     scanf("%d %d",&n,&m);
10     int a[15]={0},b[15]={0};
11     for(int i=0;i<n;i++){
12         int num;
13         scanf("%d",&a[i]);
14     }
15     for(int i=0;i<m;i++){
16         int num;
17         scanf("%d",&num);
18         b[num]++;
19     }
20     for(int i=0;i<n;i++){
21         if(b[a[i]]>0){
22             printf("%d ",a[i]);
23         }
24     }
25 
26 }
View Code

B.CodeForces - 994B 

题意:与圆桌骑士不同的是,多边形圆桌骑士没有贵族身份却乐于自相残杀。但每个骑士都有一些力量,一个骑士可以杀死另一个骑士,当且仅当他的力量大于受害者的力量。然而,即使是这样的骑士也会折磨他的良心,所以他最多只能杀死k个骑士。此外,每个骑士都有一定数量的硬币。杀死一个人后,骑士可以捡起所有受害者的硬币。现在每个骑士都在思考:如果他杀死其他骑士,他能得到多少金币?你应该为每个骑士回答这个问题。

思路:直接按照题目要求,其实就是求前n项和,然后减去最小的那一个

想错:一开始想用set找前几个里面的最小值,发现wa8样例,感觉set直接去重了,估计是出了岔子,后来又用数组手动找的,也不会超时,最简单的往往最有效

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<set>
 7 using namespace std;
 8 const int maxx=1e5+10;
 9 struct people{
10     long long int power;
11     long long int xu;
12     long long int money;
13     long long int sum=0;
14     long long int p=0;
15 }s[maxx];
16 bool cmp1(people a,people b){
17     return a.power<b.power;
18 }
19 bool cmp2(people a,people b){
20     return a.xu<b.xu;
21 }
22 bool cmp3(int x,int y){
23     return x>y;
24 }
25 int main(){
26     int n,k;
27     scanf("%d %d",&n,&k);
28     for(int i=0;i<n;i++){
29         scanf("%lld",&s[i].power);
30         s[i].xu=i;
31     }
32     for(int i=0;i<n;i++){
33         scanf("%lld",&s[i].money);
34     }
35     long long int v[15]={0};
36     sort(s,s+n,cmp1);
37     long long int minn=1e9;
38     long long int sum=0;
39     set<long long int> num;
40     int t=-1;
41     for(int i=0;i<n;i++){
42         sort(v,v+t+1,cmp3);
43         if(t!=10){
44             t++;
45         }
46         for(int j=0;j<k&&j<t;j++){
47             s[i].sum+=v[j];
48         }
49         s[i].sum+=s[i].money;
50         v[t]=max(s[i].money,v[t]);
51     }
52     sort(s,s+n,cmp2);
53     for(int i=0;i<n;i++){
54         printf("%lld ",s[i].sum);
55     }
View Code

C.CodeForces - 994C 

题意:就是问两个正方形是不是相交

思路:直接枚举每个点即可,因为点的范围很小

想错:我一开始看它给的图,以为只要是顶点在另一个图形里面就行,结果不过,还有那种交叉,顶点就会都在图形外的,直接枚举就能解决的问题

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 struct point
 4 {
 5     int x,y;
 6     int det(point p)
 7     {
 8         return x*p.y-y*p.x;
 9     }
10 };
11 point a[10],b[10];
12 int GetCross(point p1, point p2,point p)
13 {
14     return (p2.x - p1.x) * (p.y - p1.y) -(p.x - p1.x) * (p2.y - p1.y);
15 }
16 bool check(point p)
17 {
18     return GetCross(b[1],b[2],p) * GetCross(b[3],b[4],p) >= 0 && GetCross(b[2],b[3],p) * GetCross(b[4],b[1],p) >= 0;
19 }
20 int main()
21 {
22     for(int i=1;i<=4;i++)
23     {
24         scanf("%d%d",&a[i].x,&a[i].y);
25     }
26     for(int i=1;i<=4;i++)
27     {
28         scanf("%d%d",&b[i].x,&b[i].y);
29     }
30     int mix = min(min(min(a[1].x,a[2].x),a[3].x),a[4].x);
31     int mxx = max(max(max(a[1].x,a[2].x),a[3].x),a[4].x);
32     int miy = min(min(min(a[1].y,a[2].y),a[3].y),a[4].y);
33     int mxy = max(max(max(a[1].y,a[2].y),a[3].y),a[4].y);
34     for(int i=mix;i<=mxx;i++)
35     {
36         for(int j=miy;j<=mxy;j++)
37         {
38             point pi;
39             pi.x = i;
40             pi.y=j;
41             if(check(pi))
42             {
43                 printf("YES\n");
44                 return 0;
45             }
46         }
47     }
48     printf("NO\n");
49     return 0;
50 }
View Code

 

标签:10,训练,point,int,long,1.28,骑士,include
来源: https://www.cnblogs.com/bonel/p/14349774.html