A. Be Positive
题意:给出一个数组 每个树去除以d(d!=0)使得数组中大于0的数 大于ceil(n/2) 求任意d
思路:数据小 直接暴力就完事了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=500; 4 double a[maxn]; 5 int main(){ 6 int n; 7 scanf("%d",&n); 8 for(int i=0;i<n;i++){ 9 scanf("%lf",&a[i]); 10 } 11 int temp=ceil(n*1.0/2); 12 for(int i=-1e3;i<=1e3;i++){ 13 if(i==0)continue; 14 int flag=0; 15 for(int j=0;j<n;j++){ 16 if(a[j]/i>0){ 17 flag++; 18 19 } 20 } 21 if(flag>=temp){ 22 printf("%d ",i); 23 return 0; 24 } 25 } 26 printf("0 "); 27 return 0; 28 }
B. Two Cakes
题意:给出一个1-n的数组 每个数字都出现两编 两个人 每个人从1--n开始按大小选择数字(代价为数组上走多远距离) 每个数字只能选择一次 问最少要走多久
思路:把每个数的位置记一下 然后直接算上一个位置到下一个位置的最小和是多少 例如 要算2 的 直接算2个1分别到两个2的两种情况即可,因为这是无后效性的
枚举到哪个数字 当前时刻两个人肯定在上一个位置 例如要到n时两个人肯定在n-1出发
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=500; 4 double a[maxn]; 5 int main(){ 6 int n; 7 scanf("%d",&n); 8 for(int i=0;i<n;i++){ 9 scanf("%lf",&a[i]); 10 } 11 int temp=ceil(n*1.0/2); 12 for(int i=-1e3;i<=1e3;i++){ 13 if(i==0)continue; 14 int flag=0; 15 for(int j=0;j<n;j++){ 16 if(a[j]/i>0){ 17 flag++; 18 19 } 20 } 21 if(flag>=temp){ 22 printf("%d ",i); 23 return 0; 24 } 25 } 26 printf("0 "); 27 return 0; 28 }
C. Connect
题意:给出一张图 可以在不同连通快之间做通道 但是会消耗 算术距离的代价 问最小代价是多少
思路: 图很小 只有50*50 所以直接把起点和终点的连通的快的坐标记下来 然后暴力求最小代价即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=60; 4 int n; 5 char mp[maxn][maxn]; 6 int vis[maxn][maxn]; 7 struct Node{ 8 int x,y; 9 }s1[maxn*maxn],s2[maxn*maxn]; 10 int dy[]={ 11 1,-1,0,0 12 }; 13 int dx[]={ 14 0,0,-1,1 15 }; 16 void dfs(int x,int y,int num){ 17 vis[x][y]=num; 18 for(int i=0;i<4;i++){ 19 int tx=x+dx[i],ty=y+dy[i]; 20 if(tx<1||tx>n||ty<1||ty>n)continue; 21 if(vis[tx][ty]!=0||mp[tx][ty]=='1')continue; 22 dfs(tx,ty,num); 23 } 24 } 25 26 int dist(int x1,int y1,int x2,int y2){ 27 return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); 28 } 29 int main(){ 30 31 scanf("%d",&n); 32 int sx,sy,tx,ty; 33 scanf("%d%d%d%d",&sx,&sy,&tx,&ty); 34 for(int i=1;i<=n;i++){ 35 scanf("%s",mp[i]+1); 36 } 37 38 int temp=1; 39 memset(vis,0,sizeof(vis)); 40 for(int i=1;i<=n;i++){ 41 for(int j=1;j<=n;j++){ 42 if(vis[i][j]==0&&mp[i][j]=='0'){dfs(i,j,temp);temp++;} 43 } 44 } 45 if(vis[sx][sy]==vis[tx][ty]){ 46 printf("0 "); 47 return 0; 48 } 49 int num1=0,num2=0; 50 for(int i=1;i<=n;i++){ 51 for(int j=1;j<=n;j++){ 52 if(vis[i][j]==vis[sx][sy]){ 53 s1[num1].x=i,s1[num1++].y=j; 54 } 55 if(vis[i][j]==vis[tx][ty]){ 56 s2[num2].x=i,s2[num2++].y=j; 57 } 58 } 59 } 60 int ans=maxn*maxn*2; 61 for(int i=0;i<num1;i++){ 62 for(int j=0;j<num2;j++) 63 { 64 ans=min(ans,dist(s1[i].x,s1[i].y,s2[j].x,s2[j].y)); 65 } 66 } 67 cout<<ans<<endl; 68 return 0; 69 }
D2. Toy Train
题意:一个1-n的圈 火车在这个圈上顺时针旋转 每个点有 任务:把该点的糖果送到 另外一个点去 在一个点上只能往上装一个糖果,但是可以卸下任意个
问从每个点出发 所需要的最短时间 直接把每个点从1号出发所需要的最长时间预处理一下 然后从1号点枚举 这样每个点的时间就是 最长时间减去 枚举到的起点和1之间的距离
思路: 对于一个点x假设有k个任务 那么 当前点最少需要走 完整圈(k-1)圈 然后走剩下的那个点
time= (k-1) *n + dist(start,x) +dist(x,最后一个要送的点)
所以起点选择和x点相同 最后一个点在顺时针方向上离x点最近 可以得到最小时间
暴力每个点即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=20000+5; 4 int len[maxn],b[maxn],ans[maxn]; 5 vector<int>a[maxn]; 6 multiset<int>s; 7 int main(){ 8 int n,m; 9 scanf("%d%d",&n,&m); 10 int x,y; 11 for(int i=0;i<m;i++){ 12 scanf("%d%d",&x,&y); 13 if(x>y)y+=n; 14 a[x].push_back(y); 15 } 16 for(int i=1;i<=n;i++){ 17 if(a[i].size()==0)len[i]=0; 18 else { 19 sort(a[i].begin(),a[i].end()); 20 len[i]=a[i][0]+(a[i].size()-1)*n; 21 } 22 s.insert(len[i]); 23 } 24 for(int i=1;i<=n;i++){ 25 ans[i]=*(--s.end())-i; 26 if(len[i]!=0){ 27 s.erase(s.find(len[i])); 28 s.insert(len[i]+n); 29 } 30 } 31 for(int i=1;i<=n;i++)printf("%d ",ans[i]); 32 33 return 0; 34 }