您的位置:首页 > 其它

The 4th Zhejiang Provincial Collegiate Programming Contest

2016-02-28 10:55 369 查看
A - Attack of Panda Virus
题意:给出矩阵,然后负的代表第几天可以被感染,正的代表这个电脑已经感染上这个类型的病毒,病毒可以四处扩散,最后求询问的类型的病毒的最后的种类.其中种类小的先扩散,时间小的先扩散,看了题解之后才想到优先队列去解决

代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: