codeforces 821
A
给你一个n*n矩阵
判断不是1的数 能不能有 同一行 + 同一列的 一个数 相加得到 暴力下就行
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<map> #include<algorithm> using namespace std; #define inf 1e9+7 #define MAXN 100 #define long long ll int z[MAXN][MAXN]; int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) scanf("%d",&z[i][j]); } int ok=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(z[i][j]!=1) { int a=0; for(int k=1;k<=n;k++) { if(k==i) continue; z[k][j]; for(int kk=1;kk<=n;kk++) { if(kk==j) continue; if(z[k][j]+z[i][kk]==z[i][j]) a=1; } } if(a==0) ok=1; } } } if(ok==0) printf("Yes\n"); else printf("No\n"); } return 0; }
B
y= - x/m+b
求最大的矩阵的权值 矩阵权值计算方法是 每个点的x y 都加起来
暴力跑下x 0*m 1*m ...
然后推一下矩阵权值
(x+1)*(y+1)*(x+y)/2
求max
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<map> #include<algorithm> using namespace std; #define inf 1e9+7 #define MAXN 100 #define ll __int64 int main() { ll m,b; while(scanf("%I64d%I64d",&m,&b)!=EOF) { ll ans=0; for(int i=0;;i++) { ll y=-i+b; ll x=i*m; if(y>=0) { ans=max(ans,(i*m+1)*(y+1)*(i*m+y)/2); } else break; } printf("%I64d\n",ans); } return 0; }
C
n 然后2*n个操作
add a 代表 把a加到栈里面
remove 代表出栈
要求是出栈顺序是 1 ~ n 可以用一个费用 然后让栈排序 求最小费用
要出栈的话 如果栈顶不对 那么 显然费用要加
那么 都排序了 其实就可以把栈里的数去掉了 他们不再要费用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<map> #include<algorithm> #include<stack> using namespace std; #define inf 1e9+7 #define MAXN 100 #define ll __int64 stack<int>s1; int main() { int n; while(scanf("%d",&n)!=EOF) { int to; int ans=0; int c1=0; for(int i=1;i<=n*2;i++) { char z[10]; scanf("%s",z); if(z[0]=='a') { int a; scanf("%d",&a); s1.push(a); } else { c1++; if(s1.empty()) continue; if(s1.top()==c1) s1.pop(); else { ans++; while(!s1.empty()) s1.pop(); } } } printf("%d\n",ans); } return 0; }
D
n m k
n*m 地图 然后k 个 x y
这些点如果相邻的话可以直接点
可以用一个花费 点亮一行或者一列
求从左上走到右下 最小花费
spfa ...
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<map> #include<algorithm> #include<stack> #include<deque> #include<math.h> using namespace std; #define inf 1e9+7 #define MAXN 10100 #define ll __int64 struct node { int x,y; }z[MAXN]; int n,m,q; deque<int>q1; bool vis[MAXN]; int d[MAXN]; int spfa() { memset(vis,0,sizeof(vis)); for(int i=1;i<=q;i++) d[i]=inf; d[1]=0; vis[1]=1; q1.push_back(1); while(!q1.empty()) { int now=q1.front(); q1.pop_front(); vis[now]=0; for(int i=1;i<=q;i++) { if(i==now) continue; int dx=abs(z[i].x-z[now].x); int dy=abs(z[i].y-z[now].y); int w=inf; if(dx+dy<=1) w=0; else if(dx<=2||dy<=2) w=1; if(d[now]+w<d[i]) { d[i]=d[now]+w; if(!vis[i]) { if(q1.empty()) q1.push_back(i); else { if(d[q1.front()]>d[i]) q1.push_front(i); else q1.push_back(i); } vis[i]=1; } } } } if(d[q]==inf) return -1; return d[q]; } int main() { while(scanf("%d%d%d",&n,&m,&q)!=EOF) { int a=0; for(int i=1;i<=q;i++) { scanf("%d%d",&z[i].x,&z[i].y); if(z[i].x==n&&z[i].y==m) a=1; } if(a==0) { q++; z[q].x=n+1; z[q].y=m+1; } printf("%d\n",spfa()); } return 0; }
posted on 2017-06-27 15:26 HelloWorld!--By-MJY 阅读(224) 评论(0) 编辑 收藏 举报