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;
 } 

 

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