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