UCF Local Programming Contest 2014

目录

A题

B题

C题

I题

J题


A题

给你一个字符串,问你里面的字符是元音多还是辅音多。

思路:枚举字符串,元音ans++,辅音ans--,最后判断ans正负即可。

#include <iostream>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstring>

using namespace std;

const int N=2000;


int main()
{	
//	freopen("input.txt","r",stdin);
	
	int n;
	cin>>n;
	while(n--)
	{
		string s;
		cin>>s;
		cout<<s<<endl;
		int ans=0;
		for(int i=0;i<s.length();i++)
			if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u') ans++;
			else ans--;
		if(ans>0) cout<<"1"<<endl;
		else cout<<"0"<<endl;
	}
	
	return 0;
 } 

B题

#include <iostream>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstring>

using namespace std;

const int N=2000;


int main()
{	
//	freopen("input.txt","r",stdin);
	
	int n;
	cin>>n;
	for(int j=1;j<=n;j++)
	{
		int g,p;
		cin>>g>>p;
		printf("Team #%d\n",j);
		printf("Games: %d\n",g);
		printf("Points: %d\n",p);
		printf("Possible records:\n");
		for(int i=100;i>=0;i--)
		{
			int x=i;
			int y=p-3*x;
			if(x+y<=g&&x+y>=0&&y>=0&&y<=g) 
			{
				printf("%d-%d-%d\n",x,y,g-x-y);
			}
		}
		puts("");
	}
	
	return 0;
 }

C题

贪心做法,每次让青蛙跳最远,如果最远的那一个方块不能着陆,则往后退,直到能着陆为止,如果退回了原地,则青蛙不能到达终点。

#include <iostream>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstring>

using namespace std;

const int N=2000;


int main()
{	
//	freopen("input.txt","r",stdin);
	
	int n;
	cin>>n;
	for(int k=1;k<=n;k++){
	int c,d;
	cin>>c>>d;
	string s;
	cin>>s;
	printf("Day #%d\n",k);
	cout<<c<<" "<<d<<endl;
	cout<<s<<endl;
	int ans=0;//记录步数
	d++;
	for(int i=0;i<c;)
	{
		int j=i+d;
		ans++;
		if(j>=c-1) 
		{
			break;
		}
		while(s[j]=='X')
		{
			j--;
		}
		if(j==i) 
		{
			ans=0;
			break;
		}
		i=j;
	 } 
	cout<<ans<<endl;
	puts("");	
	}
	
	return 0;
 } 

I题

题意:给你一串数,让你挑选一些。规则是:当下标为k时,你最多只能挑k/2个(注意,这对1-n每一个数都要满足)。

eg:前1个数你能挑这一个,前2个数你能挑一个,前3个数你能挑一个,前4个数你能挑2个,前5个数你能挑2个,前6个数你能挑3个...

当时看题的时候,看成找连续n/2个数了,英语不好、不认真按主谓宾来看是罪过啊。。

思路:定义一个二维数组f,f[i][j]储存从1~i中选出符合题意的j个最大值的和。注意最大的前提是要满足条件的。

代码的话是抄别人的,能看懂,但是不知道原理,就这样凑合吧。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring> 

using namespace std;

const int N=550;
typedef long long ll;

int n;
int a[N];
int f[N][N]; 

int main()
{
//	freopen("input.txt","r",stdin);
	
	int t;
	cin>>t;
	for(int j=1;j<=t;j++)
	{
		printf("Spree #%d: ",j);
		memset(a,0,sizeof a);
		cin>>n;
		for(int i=1;i<=n;i++) cin>>a[i];
		int ans=f[1][1]=a[1];
		for(int i=2;i<=n;i++)
			for(int j=1;j<=i/2;j++)
				f[i][j]=max(f[i-1][j],f[i-1][j-1]+a[i]);
		cout<<max(ans,f[n][n/2])<<endl;
	 } 
	
	return 0;
 }

J题

题解:感觉这道题有3个坑点。

1、阶乘是很大的数,算不了几个就会爆long long。所以必须用对数代替阶乘来比较大小。

logn!=log1+log2+log3+...logn-1+logn.比较n!与m!的大小也就是比较logn!与logm!的大小,而比较logn!与logm!可以转化为比较log1+..+logn与log1+...logm的大小。

2、求对数什么的,最后的结果往往是小数,所以数组类型要改成double。

3、C和C++中double类型是不能直接比较的。详见博客https://blog.csdn.net/lwgkzl/article/details/79548882

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring> 

using namespace std;

const int N=2510;
const double eps=1e-6;
typedef long long ll;

int n;
double fac[N];

int main()
{
//	freopen("input.txt","r",stdin);
	fac[0]=0;
	for(int i=1;i<=2503;i++) fac[i]=fac[i-1]+log(i);
	int t;
	cin>>t;
	for(int j=1;j<=t;j++)
	{
		printf("Case #%d: ",j);	
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		double A=0,B=0,C=0;
		int x;
		for(int i=0;i<a;i++) 
		{
			scanf("%d",&x);
			A+=fac[x];
		}
		for(int i=0;i<b;i++)
		{
			scanf("%d",&x);
			B+=fac[x];
		}
		for(int i=0;i<c;i++)
		{
			scanf("%d",&x);
			C+=fac[x];
		}
		if(A>B+eps&&A>C+eps) cout<<"A"<<endl;
		else if(B>A+eps&&B>C+eps) cout<<"B"<<endl;
		else if(C>A+eps&&C>B+eps) cout<<"C"<<endl;
		else cout<<"TIE"<<endl;
	}
	
	return 0;
 } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章