UCFLocal Programming Contest 2015部分题解

eg:感觉题目很简单,但是下午有课,打了俩小时多就去上课了,最后七题结尾。
比赛传送门

A-Find the twins

题意:找出十个数里是否有17和18
题解:签到

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
    ll f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
int a[11];
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int zack=0,mack=0;
		for(int i=1;i<=10;i++){
			scanf("%d",&a[i]);
			if(a[i]==17)zack=1;
			if(a[i]==18)mack=1;
		}
		for(int i=1;i<10;i++)printf("%d ",a[i]);
		printf("%d\n",a[10]);
		if(zack && mack)puts("both");
		else if(zack)puts("zack");
		else if(mack)puts("mack");
		else puts("none");
		printf("\n");
	} 
	return 0;
}

B-Medal Ranking

题意:给出两个国家的金牌,银牌,铜牌数量。有两种排序方法,第一种是奖牌的总数,第二种是每个牌的数量按照优先级比较。
看A国家是否都能赢B国家。
题解:签到题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
    ll f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
struct arr{
	int sum,no,g,s,m;
}a[3];
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int count=0,color=0;
		for(int i=1;i<=2;i++){
			scanf("%d%d%d",&a[i].g,&a[i].s,&a[i].m);
			a[i].sum=a[i].g+a[i].s+a[i].m;a[i].no=i;
		}
		printf("%d %d %d %d %d %d\n",a[1].g,a[1].s,a[1].m,a[2].g,a[2].s,a[2].m);
		if(a[1].sum>a[2].sum)count=1;
		if(a[1].g>a[2].g)color=1;
		else if(a[1].g==a[2].g){
			if(a[1].s>a[2].s)color=1;
			else if(a[1].s==a[2].s){
				if(a[1].m>a[2].m)color=1;
			}
		}
		if(count && color)puts("both");
		else if(count)puts("count");
		else if(color)puts("color");
		else puts("none");
		puts("");
	}
	return 0;
}

C-Brownies vs. Candies vs. Cookies

题意:给出n组人和m个饼干,若m个饼干小于等于当前的人,那么m可以翻倍。
题解:模拟即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
    ll f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
int n,m,k,x;
int main(){
	int T;
	scanf("%d",&T);
	for(int ttt=1;ttt<=T;ttt++){
		scanf("%d%d",&n,&m);
		printf("Practice #%d: %d %d\n",ttt,n,m);
		scanf("%d",&k);
		for(int i=1;i<=k;i++){
			scanf("%d",&x);
			if(m>x)printf("%d %d\n",x,m-x),m-=x;
			else {
				while(m<=x)m*=2;
				printf("%d %d\n",x,m-x),m-=x; 
			}
		}
		puts("");
	}
	return 0;
}

D-Lemonade Stand

题意:做一杯奶茶需要x个柠檬和y份糖,经营n天,每天需要做ai份奶茶,当天一个柠檬的价格是bi,80份糖的价格是ci,只能80份80份的买糖。
题解:贪心,如果在第i天柠檬不够了,那么一直买到第j天的需要,保证bj<bi。糖同理,但是糖复杂一点判断一下即可。

#include<bits/stdc++.h>
using namespace std;
struct day{
	int num;
	int pl;
	int ps;
}a[1005];
priority_queue<int, vector<int>, greater<int> >q1,q2;
int main(){
	int k,n,t,su=0,ple,psu,pl,ps;
	cin>>n;
	while(n--){
		while(!q1.empty())q1.pop();
		while(!q2.empty())q2.pop();
		su=0;
		cin>>k>>ple>>psu;
		long long ans=0;
		for(int i=0;i<k;i++){
			scanf("%d%d%d",&a[i].num,&a[i].pl,&a[i].ps);
		}
		for(int i=0;i<k;i++){
			q1.push(a[i].pl);
			ans=ans+q1.top()*a[i].num*ple; 
		}
		for(int i=0;i<k;i++){
			q2.push(a[i].ps);
			if(a[i].num*psu>su){
				int ff;
				if((a[i].num*psu-su)%80==0)ff=(a[i].num*psu-su)/80;else ff=(a[i].num*psu-su)/80+1;
				ans=ans+q2.top()*ff;
				su=ff*80-(a[i].num*psu-su);
			}
			else su=su-a[i].num*psu;
		}
		cout<<ans<<endl;
	}
	return 0;
}

E-Rain Gauge

题意:算出同心的圆和正方形的面积交
题解:几何题,三种情况分类讨论即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double mPI=3.14159265358979;
ll read(){
    ll f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
double s,r;
double solve(){
	if(2*r*r>=s*s)return s*s;
	if(s>=2*r)return mPI*r*r;
	double d=s/2;
	double s1=sqrt(r*r-d*d)*d;
	double s2=r*r/2*(mPI/2-2*acos(d/r));
	return (s1+s2)*4;
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%lf%lf",&s,&r);
		printf("%.2lf\n",solve());
	}
	return 0;
}

F-Balanced Strings

题意:给出平衡字符串的定义:任意偶数长度的连续子串的元音字母和辅音字母个数相同。现在各出一个只含小写字母和?的字符串,?可以安排任意字母,问有多少种方法使得其为一个平衡字符串。
题解:统一考虑整个字符串,假设第一个为元音,那么第一个?就有20种,之后类推。假设第一个为辅音,那么第一个?为元音,之后类推。最后答案为两种之和。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
    ll f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
char s[maxn];
int main(){
	int T,ttt=0;
	scanf("%d",&T);
	while(T--){
		ttt++;
		ll ans=0;
		scanf("%s",&s);
		int len=strlen(s);
		for(int j=0;j<2;j++){
			ll sum=1;
			for(int i=0;i<len;i++){
				int flag=0;
				if(s[i]=='a' || s[i]=='e' || s[i]=='i' || s[i]=='o' || s[i]=='u' || s[i]=='y')flag=1;
				if((i+j)%2){
					if(s[i]=='?')sum*=20;
					else if(flag)sum=0;
				}else {
					if(s[i]=='?')sum*=6;
					else if(!flag)sum=0;
				}
			}
			ans+=sum;
		}
		printf("String #%d: %lld\n",ttt,ans);
		puts("");
	}
	return 0;
}

G-Towers of Hanoi Grid

题意:二维汉诺塔,问最少步数。
题解:一个盘子的最少步数为 2 ( m 1 ) 2*(m-1) ,n个盘子就是 n 2 m 1 n*2*(m-1) ,不成立的情况就是 n > ( m 1 ) ( m 1 ) + 1 n>(m-1)*(m-1)+1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
    ll f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
int n,m;
int main(){
	int T,ttt=0;
	scanf("%d",&T);
	while(T--){
		ttt++;
		scanf("%d%d",&n,&m);
		printf("Grid #%d: ",ttt);
		if(n>(m-1)*(m-1)+1)puts("impossible");
		else{
			printf("%d\n",n*2*(m-1));
		}
		puts("");
	}
	return 0;
}
发布了11 篇原创文章 · 获赞 8 · 访问量 1793

猜你喜欢

转载自blog.csdn.net/weixin_43014282/article/details/104525794