2020百度之星初赛第二场部分题解(1001/1002/1003)

1001

思路:算出每次亏损的前,要向上取整

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int t, n,m,p;
 7     scanf("%d",&t);
 8     while(t--)
 9     {
10         scanf("%d%d%d",&n,&m,&p);
11         int x=ceil(m*1.0*p*0.01);
12         if(m>n)
13         {
14             printf("0\n");
15             continue;
16         }
17         n-=m;
18         printf("%d\n",(int )(n/x)+1);
19     }
20     return 0;
21 }
1001

1002

题意:有n个点,算出n个点之间的距离之和

思路:题目要求距离之和最小,所以当n个点都在同一条直线上是距离之和最短,则题目就变成了在一条直线上求n个点的相互之间的距离之和。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+5;
 4 typedef long long ll;
 5 ll a[N];
 6 ll sum[N];
 7 
 8 int main()
 9 {
10     int t,n;
11     scanf("%d",&t);
12     while(t--)
13     {
14         memset(sum,0,sizeof(sum));
15         scanf("%d",&n);
16         for(int i=1;i<=n;i++)
17             scanf("%lld",&a[i]);
18         sort(a+1,a+1+n);
19         for(int i=1;i<=n;i++)
20             sum[i]=(ll)(sum[i-1]+a[i]);
21         ll ans=0;
22         for(int i=1;i<=n;i++)
23             ans+=(ll)(sum[n]-sum[i-1]-(ll)((n+1-i)*a[i]));
24         printf("%lld\n",ans);
25     }
26     return 0;
27 }
1002

思路:将所以人的活动轨迹按照时间大小从小到大排序,在遍历所有的活动轨迹,如果时间相同且地点相同则被感染。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=2e5+5;
 4 struct node
 5 {
 6     int id,t,p;
 7 }ss[N];
 8 int n,len;
 9 bool cmp(struct node x,struct node y)
10 {
11     if(x.t!=y.t)return x.t<y.t;
12     if(x.p!=y.p)return x.p<y.p;
13     return x.id<y.id;
14 }
15 bool vis[N];
16 
17 int main()
18 {
19     int t;
20     scanf("%d",&t);
21     while(t--)
22     {
23         memset(vis,0,sizeof(vis));
24         int cnt=0;
25         scanf("%d",&n);
26         for(int j=1;j<=n;j++)
27         {
28             scanf("%d",&len);
29             for(int i=0;i<len;i++)
30             {
31                 scanf("%d%d",&ss[cnt].t,&ss[cnt].p);
32                 ss[cnt++].id=j;
33             }
34         }
35         sort(ss,ss+cnt,cmp);
36         vis[1]=1;
37         for(int i=1;i<cnt;i++)
38             if(ss[i].t==ss[i-1].t&&ss[i].p==ss[i-1].p)
39             {
40                 if(vis[ss[i-1].id]==1||vis[ss[i].id]==1)
41                 {
42                     vis[ss[i].id]=vis[ss[i-1].id]=1;
43                     int j=i;
44                     while(ss[j].t==ss[j-1].t&&ss[j].p==ss[j-1].p)
45                     {
46                         vis[ss[j].id]=vis[ss[j-1].id]=1;
47                         j--;
48                     }
49                 }
50             }
51         int flag=0;
52         for(int i=1;i<=n;i++)
53             if(vis[i]==1)
54             {
55                 if(flag==0)
56                 {
57                     printf("%d",i);
58                     flag=1;
59                 }
60                 else printf(" %d",i);
61             }
62         printf("\n");
63     }
64     return 0;
65 }
1003

猜你喜欢

转载自www.cnblogs.com/zenghuan0620/p/13377927.html
今日推荐