The 4th Zhejiang Provincial Collegiate Programming Contest
2016-02-28 10:55
369 查看
A - Attack of Panda Virus
题意:给出矩阵,然后负的代表第几天可以被感染,正的代表这个电脑已经感染上这个类型的病毒,病毒可以四处扩散,最后求询问的类型的病毒的最后的种类.其中种类小的先扩散,时间小的先扩散,看了题解之后才想到优先队列去解决
代码:
B - Beautiful Meadow
题意:给出n*m的草地,1代表上面有草,0代表被清理过,两个要求1,不是所有的各自都是1,2.清理过的格子不想连.
有点坑的是不知道为什么初始化成0,然后每次判断边界会错.初始化成-1就ac了
代码
C - Code Formatter
题意:统计多少个\t于句子之后有个空格,然后一个\t代表四个空格
代码:
D - Deck of Cards
题意:有A-10,J,Q,K和joker,分别代表1-10,10,10,10,任意值.有三个槽1,2,3.槽内值小于21时可以放卡片,当槽内值等于21时就清空,放牌按给定顺序,没牌或没槽,游戏结束
放一张牌50分,清空一次100*对应槽位(既1,2,3)
计算最大得分
代码:
E – Evolution
题意:物种进化有多个过程,给出每个过程的现有数量,给出过程到过程的进化百分比
求一定年份之后,最终物种的数量,本质是矩阵的快速幂
代码:
F - Fish and Her Bowl
挖坑待填
G - Google Map
题意:相当在XY上不断二分,一开始先转换坐标,然后按要求输出就是了
代码:
H - Happy Life
题意:给出关系矩阵,让每个人的happy值都不小于0,做法正确性有待考究,其实就是直接暴力.过了,说明他的数据很水,队友还有直接全部输出yes的也过了,数据确实很水
代码:
I - Image Transformation
题意:给出图像大小,并且给出对应位置的rgb值,求平均值
代码:
题意:给出矩阵,然后负的代表第几天可以被感染,正的代表这个电脑已经感染上这个类型的病毒,病毒可以四处扩散,最后求询问的类型的病毒的最后的种类.其中种类小的先扩散,时间小的先扩散,看了题解之后才想到优先队列去解决
代码:
#include<iostream> #include<queue> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct node { int day,type,x,y; bool friend operator < (node a ,node b) { if(a.day!=b.day) return a.day>b.day; return a.type>b.type; } }; priority_queue <node> q; int n,m; int cnt[505*505]; int a[505][505]; int dir[4][2]= {0,1,0,-1,1,0,-1,0}; //上下右左 void bfs() { while(!q.empty()) { int minday=0; node p=q.top(); q.pop(); for(int i=0; i<4; i++) { node temp; temp.x=p.x+dir[i][0]; temp.y=p.y+dir[i][1]; if(temp.x>=1&&temp.x<=n&& temp.y>=1&&temp.y<=m&& a[temp.x][temp.y]<0) { if(p.day>=a[temp.x][temp.y]*-1) { temp.type=p.type; temp.day=p.day; a[temp.x][temp.y]=p.type; q.push(temp); cnt[p.type]++; } else { if(a[temp.x][temp.y]>minday||!minday) minday=a[temp.x][temp.y]; } } } if(minday) { p.day=-minday; q.push(p); } } } int main() { node x; while(cin>>n>>m) { while(!q.empty()) q.pop(); memset(cnt,0,sizeof(cnt)); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cin>>a[i][j]; if(a[i][j]>0) { x.x=i; x.y=j; x.type=a[i][j]; x.day=1; cnt[a[i][j]]++; q.push(x); } } } bfs(); int k,t; cin>>k; while(k--) { cin>>t; cout<<cnt[t]<<endl; } } return 0; }
B - Beautiful Meadow
题意:给出n*m的草地,1代表上面有草,0代表被清理过,两个要求1,不是所有的各自都是1,2.清理过的格子不想连.
有点坑的是不知道为什么初始化成0,然后每次判断边界会错.初始化成-1就ac了
代码
#include<iostream> #include<algorithm> #include<string> #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> #include<queue> #define mod 1e9+7 #define ll long long #define MAXSIZE 100005 #define inf 0x3f3f3f3f #define eps 1e-7 #define PI acos(-1) using namespace std; int main(){ int n,m; int a[16][16]; while(~scanf("%d %d",&n,&m)) { if(n == 0 && m == 0) break; int ans =0; int flag = 0; memset(a,-1,sizeof(a)); for(int i = 1;i <=n;++i) { for(int j=1;j<=m;++j) { scanf("%d",&a[i][j]); if(a[i][j] == 0) ans ++; } } if(!ans) { printf("No\n"); continue; } for(int i = 1;i <=n;++i) { for(int j=1;j<=m;++j) { if(a[i][j] == 0) { if(a[i-1][j] == 0 || a[i+1][j] == 0 || a[i][j-1] == 0 || a[i][j+1] == 0) flag = 1; } } } if(flag) printf("No\n"); else printf("Yes\n"); } return 0; }
C - Code Formatter
题意:统计多少个\t于句子之后有个空格,然后一个\t代表四个空格
代码:
#include<iostream> #include<algorithm> #include<string> #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> #include<queue> #define mod 1e9+7 #define ll long long #define MAXSIZE 100005 #define inf 0x3f3f3f3f #define eps 1e-7 #define PI acos(-1) using namespace std; int main() { int t; scanf("%d%*c",&t); while(t--) { string s; int ans = 0,cnt = 0; while(1) { getline(cin,s); if(s == "##") break; for(int i = 0;i<s.size();++i) { if(s[i] == '\t') ans ++; } for(int i = s.size()-1;i>=0;--i) { if(s[i] == ' ') cnt ++; else if(s[i] == '\t') cnt += 4; else break; } } printf("%d tab(s) replaced\n",ans); printf("%d trailing space(s) removed\n",cnt); } return 0; }
D - Deck of Cards
题意:有A-10,J,Q,K和joker,分别代表1-10,10,10,10,任意值.有三个槽1,2,3.槽内值小于21时可以放卡片,当槽内值等于21时就清空,放牌按给定顺序,没牌或没槽,游戏结束
放一张牌50分,清空一次100*对应槽位(既1,2,3)
计算最大得分
代码:
#include<iostream> #include<algorithm> #include<string> #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> #include<queue> #define mod 1e9+7 #define ll long long #define MAXSIZE 100005 #define inf 0x3f3f3f3f #define eps 1e-7 #define PI acos(-1.0) using namespace std; int dp[120][40][40][40]; vector<char> vt; void init() { vt.clear(); memset(dp,-1,sizeof(dp)); dp[0][0][0][0] = 0; } int Value(char ch) { if(ch >= '2' && ch <= '9') return ch - '0'; if(ch == 'A') return 1; if(ch == 'T' ||ch == 'J' ||ch == 'Q' ||ch == 'K' ) return 10; if(ch == 'F') return 21; } int main() { int n; while(~scanf("%d",&n) && n) { char ch; init(); for(int i=0; i<n; ++i) { cin >> ch; vt.push_back(ch); } int val; for(int i=1; i<=n; ++i) { for(int j=0; j<=30; ++j) { for(int k=0; k<=30; ++k) { for(int l=0; l<=30; ++l) { if(dp[i-1][j][k][l] == -1) continue; if(j < 21) { int x = Value(vt[i-1]); val = j + x; if(vt[i-1] == 'F') val = 21; if(val < 21) dp[i][val][k][l] = max(dp[i][val][k][l],dp[i-1][j][k][l] + 50); if(val == 21) dp[i][0][k][l] = max(dp[i][0][k][l],dp[i-1][j][k][l] + 150); if(val > 21) dp[i][val][k][l] = max(dp[i][val][k][l],dp[i-1][j][k][l] + 50); } if(k < 21) { int x = Value(vt[i-1]); val = k + x; if(vt[i-1] == 'F') val = 21; if(val < 21) dp[i][j][val][l] = max(dp[i][j][val][l],dp[i-1][j][k][l] + 50); if(val == 21) dp[i][j][0][l] = max(dp[i][j][0][l],dp[i-1][j][k][l] + 250); if(val > 21) dp[i][j][val][l] = max(dp[i][j][val][l],dp[i-1][j][k][l] + 50); } if(l < 21) { int x = Value(vt[i-1]); val = l + x; if(vt[i-1] == 'F') val = 21; if(val < 21) dp[i][j][k][val] = max(dp[i][j][k][val],dp[i-1][j][k][l] + 50); if(val == 21) dp[i][j][k][0] = max(dp[i][j][k][0],dp[i-1][j][k][l] + 350); if(val > 21) dp[i][j][k][val] = max(dp[i][j][k][val],dp[i-1][j][k][l] + 50); } } } } } int ans =-1; for(int i=1; i<=n; ++i) { for(int j=0; j<=30; ++j) { for(int k=0; k<=30; ++k) { for(int l=0; l<=30; ++l) { ans = max(ans,dp[i][j][k][l]); } } } } printf("%d\n",ans); } return 0; }
E – Evolution
题意:物种进化有多个过程,给出每个过程的现有数量,给出过程到过程的进化百分比
求一定年份之后,最终物种的数量,本质是矩阵的快速幂
代码:
#include<iostream> #include<algorithm> #include<string> #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> #include<queue> #define mod 1e9+7 #define ll long long #define MAXSIZE 100005 #define inf 0x3f3f3f3f #define eps 1e-7 #define PI acos(-1.0) using namespace std; struct Matrix { int n,m; double maps[205][205]; Matrix(int sn=0,int sm=0,bool isUnit=false) { n = sn; m = sm; memset(maps,0,sizeof(maps)); if(isUnit) { for(int i=0;i<n;++i) maps[i][i] = 1; } } Matrix operator * (const Matrix &b) const { Matrix ret(n,b.m,false); for(int i=0; i<n; ++i) { for(int j=0; j<b.m; ++j) { for(int k=0; k<m; ++k) { ret.maps[i][j] = ret.maps[i][j] + maps[i][k] * b.maps[k][j]; } } } return ret; } }; int n,m,t,x,y; int aa[205]; double p,ans; Matrix qpow(Matrix a,int n) { Matrix ret(a.n,a.m,true); while(n) { if(n & 1) ret = ret * a; a = a * a; n >>= 1; } return ret; } int main() { while(~scanf("%d%d",&n,&m)&&(n||m)) { Matrix a(n,n,true),b(n,n); for(int i=0; i<n; i++) scanf("%d",&aa[i]); scanf("%d",&t); while(t--) { scanf("%d%d%lf",&x,&y,&p); a.maps[x][y] += p; a.maps[x][x] -= p; } /* cout<<endl; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { cout<<a.maps[i][j]<<" "; } cout<<endl; }*/ b = qpow(a,m); /*cout<<endl; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { cout<<b.maps[i][j]<<" "; } cout<<endl; }*/ ans = 0; for(int i=0; i<n; ++i) { //printf("%.0lf\n",aa[i] * b.maps[i][n-1]); ans += aa[i] * b.maps[i][n-1]; } printf("%.0lf\n",ans); } return 0; }
F - Fish and Her Bowl
挖坑待填
G - Google Map
题意:相当在XY上不断二分,一开始先转换坐标,然后按要求输出就是了
代码:
#include<iostream> #include<algorithm> #include<string> #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> #include<cstdlib> #include<queue> #define mod 1e9+7 #define ll long long #define MAXSIZE 100005 #define PI acos(-1.0) using namespace std; double changeX(double x){ return x*PI/180; } double changeY(double y){ return log(tan(PI/4+(y*PI/180)/2)); } int main() { double x,y,t; while(cin>>x>>y>>t) { double N=changeY(85.0),S=changeY(-85.0), W=changeX(-180.0),E=changeX(180.0); x=changeX(x); y=changeY(y); cout<<"t"; while(t--){ double mid1=(N+S)/2; double mid2=(W+E)/2; int flag1=0,flag2=0; if(x>=mid2) flag2=1; if(y>=mid1) flag1=1; if(flag1==1&&flag2==1) { cout<<"r"; S = mid1; W = mid2; } if(flag1==1&&flag2==0) { cout<<"q"; S = mid1; E = mid2; } if(flag1==0&&flag2==1) { cout<<"s"; N = mid1; W = mid2; } if(flag1==0&&flag2==0) { cout<<"t"; N = mid1; E = mid2; } } cout<<endl; } return 0; }
H - Happy Life
题意:给出关系矩阵,让每个人的happy值都不小于0,做法正确性有待考究,其实就是直接暴力.过了,说明他的数据很水,队友还有直接全部输出yes的也过了,数据确实很水
代码:
#include<iostream> #include<algorithm> #include<string> #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> #include<queue> #define mod 1e9+7 #define ll long long #define MAXSIZE 100005 #define inf 0x3f3f3f3f #define eps 1e-7 #define PI acos(-1) using namespace std; int G[205][205]; int p[205]; int main() { int n; while(cin>>n){ for(int i=0;i<n;i++){ p[i]=1; for(int j=0;j<n;j++) cin>>G[i][j]; } int cnt=0,flag=0,jishu=0; for(int i=0;i<n;i++){ jishu++; int temp=0; for(int j=0;j<n;j++) temp+=p[j]*G[i][j]; temp*=p[i]; if(temp<0){ p[i]*=-1; i=-1; cnt=0; } else cnt++; if(cnt==n){ flag=1; break; } if(jishu>=1000000) break; } if(!flag) cout<<"No"<<endl; else { cout<<"Yes"<<endl; for(int i=0;i<n;i++){ if(p[i]==1) cout<<"+"<<endl; else cout<<"-"<<endl; } } } return 0; }
I - Image Transformation
题意:给出图像大小,并且给出对应位置的rgb值,求平均值
代码:
#include<iostream> #include<algorithm> #include<string> #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> #include<queue> #define mod 1e9+7 #define ll long long #define MAXSIZE 100005 #define inf 0x3f3f3f3f #define eps 1e-7 #define PI acos(-1) using namespace std; int main() { int r[120][120],g[120][120],b[120][120]; int p[120][120]; int n,m; int c = 1; while(~scanf("%d %d",&n,&m)) { if(n == 0 && m == 0) break; printf("Case %d:\n",c++); for(int i = 0;i<n;++i) { for(int j=0;j<m;++j) { scanf("%d",&r[i][j]); } } for(int i = 0;i<n;++i) { for(int j=0;j<m;++j) { scanf("%d",&g[i][j]); } } for(int i = 0;i<n;++i) { for(int j=0;j<m;++j) { scanf("%d",&b[i][j]); } } for(int i = 0;i<n;++i) { for(int j=0;j<m;++j) { p[i][j] = (r[i][j]+g[i][j]+b[i][j])/3; } } for(int i = 0;i<n;++i) { for(int j=0;j<m;++j) { if(j!=0) printf(","); printf("%d",p[i][j]); } printf("\n"); } } return 0; }
相关文章推荐
- 页面跳转时,统计数据丢失问题探讨
- android 的主题theme
- linux下静态库编译使用复杂版
- oracle 11g归档日志研究_2
- 【UVa】146 – ID Codes
- gnuplot中画图技巧
- 多线程实现原理
- Android之Monkey全参数(包含隐藏参数)
- html form表单提交后不刷新不跳转的实现方法------巧妙地用iframe
- 基于libsvm的中文文本分类原型
- Win7系统32位Oracle11g客户端安装详述
- POJ 1129 Channel Allocation(DFS + 四色定理)
- DLL和LIB的一些知识点(网上搜集)
- MATLAB的crack安装小曲
- 【USACO 5.4.1】Canada Tour
- 【转】基于内容可变长度分块(CDC)
- 【半年总结】——技术之外
- java 位运算符
- 超越线程池:Java并发并没有你想的那么糟糕 http://developer.51cto.com/art/201503/469648.htm
- block 实现封装方法