码迷,mamicode.com
首页 > 其他好文 > 详细

CCSU团队训练赛

时间:2020-06-28 00:36:07      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:顺序   不能   vector   其他   最大   数组   dice   main   表示   

CCSU团队训练赛

总结:菜,菜在马力,菜在思维,菜在体力。

题目如下

A - Play the Dice

题意:掷骰子,给长度为n的数组指点数,每个被掷中概率为1/n,m个特殊骰子,掷中还能掷一次,求期望。

题解:水题,算出不能多掷的期望,与多掷一次的概率,联立方程直接搞。

代码部分

#include<iostream>
using namespace std;

int n,m,lin,ok[1007],ok2;
double a[1007],ans,c,c2;

int main(){
	while(~scanf("%d",&n)){
		ok2=0;
		c=0;
		c2=0;
		for(int i=1;i<=n;i++){
			ok[i]=0;
			scanf("%lf",&a[i]);
			if(a[i]>0){
				ok2=1;
			}
		}
		scanf("%d",&m);
		for(int i=1;i<=m;i++){
			scanf("%d",&lin);
			ok[lin]=1;
		}
		if(n==m){
			if(ok2==1){
				printf("inf\n");
				continue;
			}
			else{
				printf("0.00\n");
				continue;
			}
		}
		for(int i=1;i<=n;i++){
			if(ok[i]==1){
				c2+=((double)1/(double)n);
			}
			c+=((double)1/(double)n*a[i]);
		}
		printf("%.2f\n",c/(1.0-c2));
	}
	
}

G - Sum of Digits

题意:猜数,告诉你每位数之和与每位数平方之和求最小符合要求的数,答案位数大于100或找不到直接输出NO;

题解:答案大于100直接gg,这个好,那这个数最大就900,平方最大就8100(100个9)。直接想到dp预处理,dp[ i ] [ j ] 意思是当和为 i 时,平方和为 j 时最少需要几位,dp[ i ] [ j ] = max( dp[ i ] [ j ] , dp[ i - p ] [ j - p * p ] + 1 ),其中 p 为 1 到 9 。再用 pre 数组记录最优情况由谁转移既可。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int dp[1007][10007],maxn=1000000007,s1,s2,t;

int pre[1007][10007];
vector<int>ho;
int main(){
	for(int i=0;i<=1000;i++){
		for(int j=0;j<=10000;j++){
			dp[i][j]=maxn;
		}
	}
	dp[0][0]=0;
	for(int i=1;i<=1000;i++){
		for(int j=1;j<=10000;j++){
			for(int p=1;p<=9;p++){
				if(i>=p&&j>=p*p){
					if(dp[i][j]>dp[i-p][j-p*p]+1){
						pre[i][j]=p;
						dp[i][j]=dp[i-p][j-p*p]+1;
					}
				}
				else{
					break;
				}
			}
		}
	}
	scanf("%d",&t);
	while(t--){
		ho.clear();
		scanf("%d%d",&s1,&s2);
		if(s1>=1000||s2>=10000){
			printf("No solution\n");
			continue;
		}
		if(dp[s1][s2]>=maxn){
			printf("No solution\n");
		}
		else{
			int l,r,lin,sum=dp[s1][s2];
			if(sum>100){
				printf("No solution\n");
				continue;
			}
			l=s1,r=s2;
			while(sum--){
				lin=pre[l][r];
				ho.push_back(pre[l][r]);
				l=l-lin;
				r=r-lin*lin;
			}
			sort(ho.begin(),ho.end());
			for(int i=0;i<ho.size();i++){
				printf("%d",ho[i]);
			}
			printf("\n");
		}
	}
}

H - Billionaires

题意:n个人,最开始在某个地方,有多少钱,统计 m 天,人有 t 次换城市操作,t行,告诉你第几天走,谁走了,去了哪(人移动后会把他的钱带走),输出每个城市的名字与其的钱大于其他城市的天数,天数为0的不输出(城市的钱等于该城市人的钱的和)。

题解:单点修改线段树水题,或用map模拟。

F - Shortest Subchain

题意:n表示数组长度,a[i-1]有到a[i]的有向边,求a[1]到a[n]的最短走法,所选取的边顺序要递增(经过靠后的边就不能再走前面的边,a[1]到a[2]为第一条边,a[n-1]到a[n]为第n-1条边)。

题解:

CCSU团队训练赛

标签:顺序   不能   vector   其他   最大   数组   dice   main   表示   

原文地址:https://www.cnblogs.com/whitelily/p/13200533.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!