A : Be Positive 题目地址:https://codeforces.com/problemset/problem/1130/A
题解:让你求是否满足一个d使得数列长为n的a数组的每个数除以d以后,所得数列正数的数量大于ceil(n);(除以后四舍五入,0不是正数)
注意d为负数的情况
参考代码:

1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int x=0,y=0; 6 int t,a[105]; 7 cin>>t; 8 for(int i=0;i<t;i++) 9 { 10 scanf("%d",&a[i]); 11 if(a[i]>0) x++; 12 if(a[i]<0) y++; 13 } 14 15 if(2*x>=t) cout<<1<<endl; 16 else if(y*2>=t) cout<<-1<<endl; 17 else cout<<0<<endl; 18 return 0; 19 }
B : Two Cakes 题目地址: https://codeforces.com/problemset/problem/1130/B
题解:两个人依次走1,2,3...n这n个数的位置,求两个人所走步数和的最小值;
DP:dp[x]:表示走完第x个数的最小步数;
则 dp[i]=dp[i-1]+min(abs(vec[i][0]-vec[i-1][0])+abs(vec[i][1]-vec[i-1][1]),abs(vec[i][0]-vec[i-1][1])+abs(vec[i][1]-vec[i-1][0]));
参考代码:

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define clr(a,b) memset(a,b,sizeof(a)) 4 #define PI acos(-1.0) 5 #define PII pair<int,int> 6 #define fi first 7 #define se second 8 #define pb push_back 9 typedef long long ll; 10 const int INF=0x3f3f3f3f; 11 const int maxn=1e5+10; 12 int n,x; 13 ll dp[maxn]; 14 vector<int> vec[maxn]; 15 int main() 16 { 17 scanf("%d",&n);clr(dp,0); 18 for(int i=1;i<=2*n;++i) 19 { 20 scanf("%d",&x); 21 vec[x].push_back(i); 22 } 23 vec[0].push_back(1); vec[0].push_back(1); 24 for(int i=1;i<=n;++i) 25 dp[i]=dp[i-1]+min(abs(vec[i][0]-vec[i-1][0])+abs(vec[i][1]-vec[i-1][1]),abs(vec[i][0]-vec[i-1][1])+abs(vec[i][1]-vec[i-1][0])); 26 printf("%lld ",dp[n]); 27 return 0; 28 }
C : Connect 题目地址: https://codeforces.com/problemset/problem/1130/C
题解:给你一张n*n的地图,0代表陆地,1代表水地;只能走陆地;
给你起点和终点,并且你只能 打通一次 两块陆地;
让你求从起点大终点需要打通的陆地之间距离的最小值;
枚举起点所能到达的点,终点所能到达的点;暴力找最小值即可
参考代码:

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define clr(a,b) memset(a,b,sizeof(a)) 4 #define PI acos(-1.0) 5 #define PII pair<int,int> 6 #define fi first 7 #define se second 8 #define pb push_back 9 typedef long long ll; 10 const int INF=0x3f3f3f3f; 11 int ans=INF,n; 12 int x[2],y[2],v[2][55][55]; 13 char z[55][55]; 14 void dfs(int a,int b,int c) 15 { 16 if(v[c][a][b]) return ; 17 v[c][a][b]=1; 18 if(z[a+1][b]=='0') dfs(a+1,b,c); 19 if(z[a][b+1]=='0') dfs(a,b+1,c); 20 if(z[a-1][b]=='0') dfs(a-1,b,c); 21 if(z[a][b-1]=='0') dfs(a,b-1,c); 22 } 23 int main() 24 { 25 cin>>n; 26 for(int i=0;i<2;i++) cin>>x[i]>>y[i]; 27 for(int i=1;i<=n;i++) scanf("%s",z[i]+1); 28 for(int i=0;i<2;i++) dfs(x[i],y[i],i); 29 for(int i=1;i<=n;i++) 30 for(int j=1;j<=n;j++) 31 { 32 if(v[0][i][j]) 33 { 34 for(int k=1;k<=n;k++) 35 for(int l=1;l<=n;l++) 36 { 37 if(v[1][k][l]) 38 ans=min(ans,(i-k)*(i-k)+(j-l)*(j-l)); 39 } 40 } 41 } 42 cout<<ans<<endl; 43 return 0; 44 }
D(D1 和 D2) :Toy Train 题目地址: https://codeforces.com/problemset/problem/1129/A2
两题一样,只是数据不一样,放一起说
题解:
有1-n个站点,成环形,有一辆运货车,在这个n个站点之间运输糖果,货车只能按照1->n的方向走,到第n个站的时候,又回到的1,现在告诉你有m个运输任务,从x站点运输一个糖果到y站点。已知货车的容量足够大,可以同时装无数个糖果,但是每一次经过一个站的时候,只能够选择其中一项任务进行运输,假设从一个站到另一个站的运输时间为1,请问从1-n每个站点作为起点,最短的运输时间分别是多少
这个题目,由于我们每次跑都是绕圈的,所以,如果站点i有 out[i]项任务的话,至少要经过站点i,out[i]次,所以,我们可以得出一个公式,假设初始起点为s,运输终点为e
dist(s,i)+n∗out[i]+dist(i,e) dist(s,i)+n*out[i]+dist(i,e)dist(s,i)+n∗out[i]+dist(i,e) 就是完成第i个站点的所有任务的时间,因此,我们只要让dist(i,e) dist(i,e)dist(i,e)最小即可
D1 D2 参考代码:

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define clr(a,v) memset(a,v,sizeof(a)) 4 #define PI acos(-1.0) 5 #define PII pair<int,int> 6 #define fi first 7 #define se second 8 #define pb push_back 9 typedef long long ll; 10 const int INF=0x3f3f3f3f; 11 const int maxn=5010; 12 int n,m,x,y; 13 int Min[maxn],out[maxn]; 14 int dis(int i,int j){return j>=i? j-i:j-i+n;} 15 int main() 16 { 17 scanf("%d%d",&n,&m); 18 clr(out,0);clr(Min,INF); 19 for(int i=1;i<=m;++i) 20 { 21 scanf("%d%d",&x,&y); 22 if(y>=x) Min[x]=min(Min[x],y-x); 23 else if(y<x) Min[x]=min(Min[x],y-x+n); 24 out[x]++; 25 } 26 27 for(int i=1;i<=n;++i) 28 { 29 int ans=0; 30 for(int j=1;j<=n;++j) 31 { 32 if(out[j]) ans=max(ans,dis(i,j)+Min[j]+(out[j]-1)*n); 33 } 34 printf("%d%c",ans,i==n?' ':' '); 35 } 36 return 0; 37 }
E : Wrong Answer 题目地址: https://codeforces.com/problemset/problem/1129/B
题解:
注意到 n≥2n≥2 时才可能有解,可以按如下方式构造一个 a1,2…na1,2…n:
令 a1=−1a1=−1 ,而后面的数都为正.记 s=∑ni=2ais=∑i=2nai,显然题目中的程序给出的答案是 s∗(n−1)s∗(n−1) .
为使这个答案比正确答案少 kk ,那么正确答案只能是 (s−1)∗n(s−1)∗n.
由于我们可以放 11 个 −1−1 , 19991999 个 106106,此时 s−n=1999∗106−2000>109s−n=1999∗106−2000>109 ,所以按照上述方法一定可以构造出一组解.
参考代码:

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define mp make_pair 5 #define pii pair<int,int> 6 const int delta=1e6-1; 7 int ans[2019],n=0,k; 8 int main() 9 { 10 scanf("%d",&k); 11 ++k; ans[++n]=-1; 12 while(k>=delta) 13 { 14 k-=delta; 15 ans[++n]=delta+1; 16 } 17 ans[++n]=k+1; 18 printf("%d ",n); 19 for(int i=1;i<=n;++i) printf("%d%c",ans[i],i==n?' ':' '); 20 return 0; 21 }