Ural Regional School Programming Contest 2011

GOV Chronicles

体验极差的四级阅读理解,大致是在文章里找每个人参加了多少比赛…用一下 Ctrl+F。 漏了最后面还有两个人各参加了一场比赛还 wa 了一发。 有几个人的信息比较含糊所幸样例里还给了答案。

#include<stdio.h>
int n,a[14]= {5,21,12,2,1,4,6,1,4,4,1,0,1,1};
int main()
{
	scanf("%d",&n);
	printf("%d",a[n]);
}

Football Goal

固定两条棒所成夹角后,显然当树和地面在门内长度相等时面积最大,此时面积可以表示成角度的一个函数,可计算出在 135 度角时取最大值。

#include<stdio.h>
#include<math.h>
double a,b;
int main()
{
	scanf("%lf%lf",&a,&b);
	printf("%.9f",(a*a+b*b)/4+a*b/sqrt(2));
}

Angry Birds

//待补题

Centipede’s Morning

蜈蚣穿鞋子,要求最坏情况下要用多少时间,考虑两种情况: 一开始全抽到右脚鞋,这样是 2b+40; 先抽到 39 只右脚鞋,然后再给左脚穿上所有的鞋,然后再把所有的剩下的左鞋去试右脚,然后再穿上右鞋,这样是 2*a+39。

#include<stdio.h>
int a,b;
int main()
{
	scanf("%d%d",&a,&b);
	a=a*2+39,b=b*2+40;
	printf("%d",a>b?a:b);
}

Bicycle Codes

#include<stdio.h>
int a,b;
int main()
{
	scanf("%d%d",&a,&b);
	printf(a%2==0||b%2==1?"yes":"no");
}

Rubinchik’s Cube

看似复杂,实际上只要考虑把红色移到目标位置即可。

#include<bits/stdc++.h>
using namespace std;
int s[4],ans=1e9;
int main()
{
	for(int i=0,c; i<4; ++i)
		for(int j=0; j<4; ++j)
		{
			scanf("%d",&c);
			if(c==1)
				++s[i<2&&j<2?0:
				    i<2&&j>=2?1:
				    i>=2&&j>=2?2:3];
		}
	for(int i=0; i<4; ++i)
		ans=min(ans,s[(i+1)%4]+s[(i+2)%4]*2+s[(i+3)%4]);
	printf("%d",ans);
}

GOV-internship 2

贪心,把 0 分别换成另一个串中非 0 且最多的字母或一种指定字母,依次求一遍取最小值。

#include<bits/stdc++.h>
using namespace std;
const int N=100009;
typedef long long ll;
ll n[2],v[2][N];
int main()
{
	for(int j=0,t; j<2; ++j)
	{
		scanf("%lld",&n[j]);
		for(int i=0; i<n[j]; ++i)
			scanf("%d",&t),++v[j][t];
	}
	ll tmp=n[0]*n[1];
	for(int i=1; i<N; ++i)
		tmp-=v[0][i]*v[1][i];
	ll ans=tmp-v[0][0]**max_element(v[1]+1,v[1]+N)-v[1][0]**max_element(v[0]+1,v[0]+N);
	for(int i=1; i<N; ++i)
		ans=min(ans,tmp-v[0][0]*v[1][i]-v[1][0]*v[0][i]-v[0][0]*v[1][0]);
	printf("%lld",ans);
}

Psych Up’s Eigenvalues

#include<bits/stdc++.h>
using namespace std;
int a[16383],siz=0,ans=0;
int main()
{
	for(int i=0,n; i<3; ++i)
		for(scanf("%d",&n); n--;)
			scanf("%d",&a[siz++]);
	sort(a,a+siz);
	for(int i=2; i<siz; ++i)
		if(a[i-2]==a[i]&&a[i-1]==a[i])
			++ans;
	printf("%d",ans);
}

Long problem statement

#include<bits/stdc++.h>
using namespace std;
string s;
int h,w,n,r=1,c=0;
int main()
{
	for(cin>>h>>w>>n; n--;)
	{
		cin>>s;
		if(c+s.size()+1<w)c+=s.size()+1;
		else if(c+s.size()<=w&&w<=c+s.size()+1)c=0,++r;
		else c=s.size()+1,++r;
	}
	if(!c)--r;
	printf("%d",r/h+(r%h?1:0));
}

Old Nokia

//待补

Ent’s Birthday

在平面上划出一块凸多边形区域使得里面恰好有给定点集的 k 个。 按横纵坐标的字典序排序后选择前 k 个,用一个五角梯形(不知道怎么形容,看代码,矩形挖掉一个角之后的情况)包住即可。特殊情况是第 k 个点在上边界,此时退化成四角梯形。

#include<bits/stdc++.h>
#define X first
#define Y second
using namespace std;
const int INF=1e9;
typedef pair<int,int> Coord;
int main()
{
	int n,k;
	scanf("%d%d",&n,&k);
	vector<Coord> p(n),ans;
	for(int i=0,x,y; i<n; ++i)
		scanf("%d%d",&p[i].X,&p[i].Y);
	sort(p.begin(),p.end());
	ans.push_back(p[k-1]);
	if(p[k-1].X-1!=-INF)ans.push_back(Coord(p[k-1].X-1,INF));
	ans.push_back(Coord(-INF,INF));
	ans.push_back(Coord(-INF,-INF));
	ans.push_back(Coord(p[k-1].X,-INF));
	printf("%d\n",ans.size());
	for(int i=0; i<ans.size(); ++i)
		printf("%d %d\n",ans[i].X,ans[i].Y);
}

Way to the University

让人比较头疼的模拟,我的做法是把其中一条车道的车等效到另一个车道上。尽量用整数运算避开浮点运算。

#include<bits/stdc++.h>
using namespace std;
int n,d,v[16383];
int main()
{
	for(scanf("%d",&n); n--;)
		scanf("%d",&d),fill(v+d+8,v+d+5+8,1);//8==20/5*2
	for(scanf("%d",&n); n--;)
		scanf("%d",&d),fill(v+d,v+d+5,1);
	for(int i=0;; ++i)
		if(*max_element(v+i+8,v+i+8+8)==0)
			return printf("%.6f",i*0.18),0;//0.18==3600/20000
}