标签:|| 范围 wro rda 数列 cstring hit stream opened
A.Be Positive
题意:给定一个数列,求数列中一半及以上的数是正数、负数还是零。
代码:
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; const int MAXN=100+2; int a,b,N; int main(){ cin >> N; for(int i=1,x;i<=N;i++){ cin >> x; if(x>0) a++; if(x<0) b++; } if(2*a>=N) cout << 1 << endl; else if(2*b>=N) cout << -1 << endl; else cout << 0 << endl; return 0; }
B. Two Cakes
题意:给定一个由两组1~N构成的数列,规定两个数a[i],a[j]之间的距离为|i-j|,求两条从1到N的路径,使得距离和最短。
题解:设f[i][0/1]为前i层蛋糕,第一个人到更靠左/右的i位置(相对的,第二个人就去另一个位置),所需要的最小花费,转移方程显然略。
代码:
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define ll long long const int MAXN=100000+2; int N; ll p[MAXN][2],f[MAXN][2]; int main(){ cin >> N; for(int i=1,x;i<=2*N;i++){ cin >> x; if(p[x][0]) p[x][1]=i; else p[x][0]=i; } p[0][0]=p[0][1]=1; for(int i=1;i<=N;i++){ f[i][0]=min(f[i-1][0]+abs(p[i-1][0]-p[i][0])+abs(p[i-1][1]-p[i][1]),f[i-1][1]+abs(p[i-1][1]-p[i][0])+abs(p[i-1][0]-p[i][1])); f[i][1]=min(f[i-1][0]+abs(p[i-1][0]-p[i][1])+abs(p[i-1][1]-p[i][0]),f[i-1][1]+abs(p[i-1][1]-p[i][1])+abs(p[i-1][0]-p[i][0])); } cout << min(f[N][0],f[N][1]) << endl; return 0; }
C. Connect
题意:给定一个图,有的位置不能通过,定义两位置间的距离为欧式距离,若两位置间有通道(花费为两者间距离,只能建一个通道),则可直接通过。求从起点到终点存在合法路径时,建通道的最小花费。
题解:数据范围很小,染色之后暴力找。
代码:
#include <cstdio> #include <climits> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; const int MAXN=100+2; const int X[]={-1,0,1,0}; const int Y[]={0,1,0,-1}; int x1,y1,x2,y2; int N,g[MAXN][MAXN],Ans; bool Flag[MAXN][MAXN]; char S[MAXN]; int Calc(int a,int b,int c,int d){ return (c-a)*(c-a)+(d-b)*(d-b);} bool Check(int x,int y){ if(!x || !y) return 0; if(x>N || y>N) return 0; if(Flag[x][y]) return 0; return g[x][y]!=1; } void DFS(int x,int y,int t){ if(t==-1 && x==x2 && y==y2){ cout << 0 << endl; exit(0); } Flag[x][y]=1,g[x][y]=t; for(int i=0,tx,ty;i<4;i++){ tx=x+X[i],ty=y+Y[i]; if(Check(tx,ty)) DFS(tx,ty,t); } } int main(){ cin >> N; cin >> x1 >> y1 >> x2 >> y2; for(int i=1;i<=N;i++){ scanf("%s",S+1); for(int j=1;j<=N;j++) g[i][j]=S[j]-‘0‘; } Ans=INT_MAX; DFS(x1,y1,-1),DFS(x2,y2,2); for(int a=1;a<=N;a++) for(int b=1;b<=N;b++){ if(g[a][b]!=-1) continue; for(int c=1;c<=N;c++) for(int d=1;d<=N;d++){ if(g[c][d]!=2) continue; Ans=min(Ans,Calc(a,b,c,d)); } } cout << Ans << endl; return 0; }
D. Toy Train
题意:给定一个环,只能单向前进。每个节点有一些货物要运到另外一些节点,每经过一个节点,只能上一个货,但能下任意数量的货,且火车容量无限,求运输完所有货物所需的最少时间。
题解:由于每次只能上一个货,因此最后下的货物一定是在货物数量最多的节点上的,而一个节点i所决定的最优时间为min{dis(起点,i)+(c[i]-1)*N+(i的一个货物到它终点的距离)},答案为这些最优时间中的最大值。
代码:
#include <cstdio> #include <climits> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; const int MAXN=100+2; const int MAXM=200+2; int N,M,a[MAXN][MAXM],Ans; int Calc(int x,int y){ if(x==y) return 0; if(y>x) return y-x; return N-x+y; } int main(){ cin >> N >> M; for(int i=1,x,y;i<=M;i++){ cin >> x >> y; a[x][++a[x][0]]=y; } for(int i=1;i<=N;i++){ Ans=0; for(int j=1,t=-1;j<=N;j++,t=-1){ for(int k=1;k<=a[j][0];k++){ if(t==-1) t=Calc(i,j)+(a[j][0]-1)*N+Calc(j,a[j][k]); else t=min(t,Calc(i,j)+(a[j][0]-1)*N+Calc(j,a[j][k])); } Ans=max(Ans,t); } cout << Ans << " "; } return 0; }
E. Wrong Answer
(待补)
标签:|| 范围 wro rda 数列 cstring hit stream opened
原文地址:https://www.cnblogs.com/WDZRMPCBIT/p/10438150.html