USACO测试赛3

USACO测试赛3

1.奶牛年轮

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
记录每一头奶牛的父亲(一句话中后面一个),并计算他到这头奶牛的年龄差距(之前就是负,之后就是正),随后从Elsie往前遍历计算并取绝对值即可。

#include <bits/stdc++.h>
using namespace std;

int n,ans=0;
string s;
map<string,int> mymap;
map<string,string> fa;
map<string,int> sign;
map<string,int> ani;

void f(string s,int &ans){
	if(s=="Bessie")
	  return;
	ans+=mymap[s];
	f(fa[s],ans);
}

int main(){
	freopen("yearcow.in","r",stdin);
	freopen("yearcow.out","w",stdout);
	cin >> n;
	sign["Rat"]=11;
	sign["Pig"]=10;
	sign["Dog"]=9;
	sign["Rooster"]=8;
	sign["Monkey"]=7;
	sign["Goat"]=6;
	sign["Horse"]=5;
	sign["Snake"]=4;
	sign["Dragon"]=3;
	sign["Rabbit"]=2;
	sign["Tiger"]=1;
	sign["Ox"]=0;
	for(int i=1;i<=n;++i){
		string n,p,d,b;
		for(int j=1;j<=8;++j){
			cin >> s;
			if(j==1)
			  n=s;
			if(j==4)
			  p=s;
			if(j==5)
			  d=s;
			if(j==8)
			  b=s;
		}
		if(p=="previous"){
			int tmp=sign[d],tp=ani[b];
			if(tmp<tp)
			   mymap[n]=tp-tmp;
			if(tmp==tp)
			   mymap[n]=12;
			if(tmp>tp)
			   mymap[n]=12-tmp+tp;
			mymap[n]=-abs(mymap[n]);
			fa[n]=b;
			ani[n]=sign[d];
		}
		else{
			int tmp=sign[d],tp=ani[b];
			if(tmp>tp)
				mymap[n]=tmp-tp;
			if(tmp==tp)
			    mymap[n]=12;
			if(tmp<tp)
			    mymap[n]=abs(12-tp+tmp);
			fa[n]=b;
			ani[n]=sign[d];
		}
	}
	f("Elsie",ans);
	cout << abs(ans) << endl;
	fclose(stdin);
	fclose(stdout);
    return 0;
}

2.舒适的牛

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
每加入一头奶牛就将它周围四个点上的奶牛数加1,如果出现了一个3,就加一,如果出现了一个4,就减一,每次输出即可。

#include <bits/stdc++.h>
using namespace std;

int n,x,y,vh[1010][1010],ans=0;
bool ha[1010][1010];

int main(){
	freopen("comfortable.in","r",stdin);
	freopen("comfortable.out","w",stdout);
	cin >> n;
	for(int i=1;i<=n;++i){
		cin >> x >> y;
		ha[x][y]=1;
		vh[x+1][y]++;
		vh[x][y+1]++;
		if(x-1>=0)
		  vh[x-1][y]++;
		if(y-1>=0)
		  vh[x][y-1]++;
		if(vh[x+1][y]==3 && ha[x+1][y]==1) 
		  ans++;
		if(vh[x+1][y]==4 && ha[x+1][y]==1)
		  ans--;
		if(vh[x][y+1]==3 && ha[x][y+1]==1)
		  ans++;
		if(vh[x][y+1]==4 && ha[x][y+1]==1)
		  ans--;
		if(vh[x][y]==3 && ha[x][y]==1)
		  ans++;
		if(x-1>=0){
			if(vh[x-1][y]==3 && ha[x-1][y]==1)
		      ans++;
		    if(vh[x-1][y]==4 && ha[x-1][y]==1)
		      ans--;
		}
		if(y-1>=0){
			if(vh[x][y-1]==3 && ha[x][y-1]==1)
		      ans++;
		    if(vh[x][y-1]==4 && ha[x][y-1]==1)
		      ans--;
		}
		cout << ans << endl;
	}
	fclose(stdin);
	fclose(stdout);
    return 0;
}

3.旋转方向

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过许多的样例,可以发现,顺逆时针只与最左边的方向(或最右边)有关,如果这个图的最左边是向北的,就是顺时针,向南则是逆时针。
随后又多种方法实现,这里用了一种最暴力的方法,打vh数组,然后暴力遍历一遍。

#include <bits/stdc++.h>
using namespace std;

int t;
string s;
int vh[300][300];

int main(){
	freopen("direction.in","r",stdin);
	freopen("direction.out","w",stdout);
	cin >> t;
	while(t--){
		memset(vh,-1,sizeof(vh));
		cin >> s;
		int x=110,y=110;
		vh[x][y]=114;
		int len=s.size();
		for(int i=0;i<len;++i){
			if(s[i]=='E'){
			   y++;
			   vh[x][y]=1;
			}
			if(s[i]=='W'){
			   y--;
			   vh[x][y]=-1;
			}
			if(s[i]=='N'){
				x--;
				vh[x][y]=2;
			}
			if(s[i]=='S'){
				x++;
				vh[x][y]=-2;
			}
		}
		bool f=false;
		for(int j=1;j<=210;++j){
		   for(int i=1;i<=210;++i){
		   	  if(vh[i][j]==2){
		   	  	cout << "CW" << endl;
		   	  	f=true;
		   	  	break;
		   	  }
		   	  if(vh[i][j]==-2){
		   	  	cout << "CCW" << endl;
		   	  	f=true;
		   	  	break;
		   	  }
		   }
		   if(f==true)
		     break;
		 }
	}
	fclose(stdin);
	fclose(stdout);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值