2020年团体程序设计天梯赛-总决赛

目录

L1-1 嫑废话上代码

L1-2 猫是液体

L1-3 洛希极限

L1-4 调和平均

L1-5 胎压监测

L1-6 吃火锅

L1-7 前世档案

L1-8 刮刮彩票

L2-1 简单计算器

L2-2 口罩发放

L2-3 完全二叉树的层序遍历

L2-4 网红点打卡攻略



L1-1 嫑废话上代码

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e5 + 24 , M = 1e3 + 24 ;
vector v[N] ;
int book[N] ; // 用于存档 
int main()
{
	cout << "Talk is cheap. Show me the code." ; 
	return 0 ;
}

L1-2 猫是液体

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e5 + 24 , M = 1e3 + 24 ;
vector v[N] ;
int book[N] ; // 用于存档 
int main()
{
//	cout << "Talk is cheap. Show me the code." ; 
	ll a , b , c , ans ;
	cin >> a >> b >> c ;
	ans = a*b*c ;
	cout << ans ;
	return 0 ;
}

L1-3 洛希极限

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e5 + 24 , M = 1e3 + 24 ;
vector v[N] ;
int book[N] ; // 用于存档 
int main()
{

	double a , b , ans ;
	int c ;
	cin >> a >> c >> b ;
	if(c == 0)
	{
		ans = 2.455*a ;
	}
	else if(c == 1)
	{
		ans = 1.26*a ;
	}
	printf("%.2f " , ans) ;
	if(ans < b)  cout << "^_^" ;
	else  cout << "T_T" ;
	return 0 ;
}

L1-4 调和平均

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e5 + 24 , M = 1e3 + 24 ;
vector v[N] ;
int book[N] ; // 用于存档 
int main()
{

	int n , i ;
	double t , ans = 0 ;
	cin >> n ;
	for(i = 0 ; i < n ; i ++)
	{
		cin >> t ;
		ans += (1.0 / t) ;
	}
	ans /= (double)n ;
	printf("%.2f" , 1.0/ans) ;
	return 0 ;
}

L1-5 胎压监测

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e5 + 24 , M = 1e3 + 24 ;
int a[6] , v[6] ;
int main()
{
	int i , d , minn , maxx = -1 , flag = 0 , cnt = 0 ;
	for(i = 1 ; i <= 4 ; i ++)  
	{
		cin >> a[i] ; 
		maxx = max(maxx , a[i]) ;
	}
	cin >> minn >> d ;
	for(i = 1 ; i <= 4 ; i ++)
	{
		if(abs(maxx-a[i]) > d || a[i] < minn)
		{
			cnt ++ ;
			flag  = i ;
		}
	}
	if(cnt == 0)  cout << "Normal" ;
	else  if(cnt == 1) printf("Warning: please check #%d!" , flag) ;
	else  cout << "Warning: please check all the tires!" ;
	return 0 ;
}

L1-6 吃火锅

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e5 + 24 , M = 1e3 + 24 ;
int a[6] , v[6] ;
int main()
{
	int cnt = 0 , ans = 0 , sum = 0 ; // 第一个  总共 
	string s ;
	while(1)
	{
		getline(cin , s) ;
		if(s == ".")  break ;
		cnt ++ ;  // 一共有几个
		if(s.find("chi1 huo3 guo1") != -1)
		{
			sum ++ ;
			if(sum == 1)  ans = cnt ;  // 第一个 
		}
	}
	cout << cnt << endl ;
	if(sum == 0)  cout << "-_-#" ;
	else  cout << ans << " " << sum ;
	return 0 ;
}

L1-7 前世档案

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e5 + 24 , M = 1e3 + 24 ;
int a[6] , v[6] ;
int main()
{
	int n , m , i , j , ans = 0 ;
	char s[36] ;
	cin >> n >> m ;
	while(m --)
	{
		ans = 1 ; 
		cin >> s ;
		for(i = 0 ; i < n ; i ++)
		{
			if(s[i] == 'n')
			{
				ans += pow(2,n-i-1) ;
			}
		}
		cout << ans << endl ;
	}
	return 0 ;
}

L1-8 刮刮彩票

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e5 + 24 , M = 1e3 + 24 ;
int a[6][6] ;
int v[14] ; // 标记 1-9 
int money[26]={0,0,0,0,0,0,10000,36,720,360,80,252,108,72,54,180,72,180,119,36,306,1080,144,1800,3600};
int main()
{
	int i , j , x , y , op , sum = 0 , num = 45 ;  // 坐标 
	for(i = 1 ; i <= 3 ; i ++)
	{
		for(j = 1 ; j <= 3 ; j ++)
		{
			cin >> a[i][j] ;
//			num -= a[i][j] ;
			v[a[i][j]] = 1 ; // 该数字已出现
			if(a[i][j] == 0)  x = i , y = j ; 
		}
	}
//	a[x][y] = num ;
	for(i = 1 ; i < 10 ; i ++)
	{
		if(v[i] == 0)
		{
			a[x][y] = i ;  //0位置的值
			break ; 
		}
	}
	for(i = 1 ; i <= 3 ; i ++)
	{
		cin >> x >> y ;
		cout << a[x][y] << endl ;
	} 
	cin >> op ; // 选择
	if(op <= 3)  // 行 
	{
		for(i = 1 ; i <= 3 ; i ++)
		{
			sum += a[op][i] ;  
		}
	}
	else if(op <= 6)  // 列 
	{
		for(i = 1 ; i <= 3 ; i ++)
		{
			sum += a[i][op-3] ;   
		}
	}
	else if(op == 7)  //左上到右下的主对角线
	{
		for(i = 1 ; i <= 3 ; i ++)
		{
			sum += a[i][i] ;  
		}
	}
	else if(op == 8)  //右上到左下的副对角线
	{
		for(i = 1 ; i <= 3 ; i ++)
		{
			sum += a[i][3-i+1] ;   
		}
	}
	cout << money[sum] ;
	return 0 ;
}

L2-1 简单计算器

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e5 + 24 , M = 1e3 + 24 ;
stack s1 ; // 数字
stack s2 ; // 字符 
int main()
{
	int n , i , j , n1 , n2;
	char op ;
	cin >> n ;
	for(i = 0 ; i < n ; i ++)
	{
		cin >> n1 ;
		s1.push(n1) ;
	} 
	for(i = 1 ; i < n ; i ++)
	{
		cin >> op ;
		s2.push(op) ;
	}
	while(!s2.empty())
	{
		n1 = s1.top() ;
		s1.pop() ;
		n2 = s1.top() ;
		s1.pop() ;
		
		op = s2.top() ;
		s2.pop() ;
		if(n1 == 0 && op == '/')
		{
			printf("ERROR: %d/0" , n2) ;
			return 0 ;
		}
		if(op == '+')
		{
			s1.push(n2+n1) ;
		}
		else if(op == '-')
		{
			s1.push(n2-n1) ;
		}
		else if(op == '*')
		{
			s1.push(n2*n1) ;
		}
		else if(op == '/')
		{
			s1.push(n2/n1) ;
		}
	}
	cout << s1.top() ;
	return 0 ;
}

L2-2 口罩发放

#include 
using namespace std ;
typedef long long ll ;
const int N = 2e3 + 24 , M = 1e3 + 24 ;
map mp1 ; // 记录时间,上一次选的时间
map  mp2 ; // 标记身体不适的人 
struct point{
	string name ;
	string id ;  // 身份证
	int op ; // 身体情况
	string time ; // 提交时间 
	int num ; // 提交顺序 
}p[N] , q[N]; 
bool cmp(point x , point y)
{
	if(x.time != y.time)  return x.time < y.time ;
	return x.num < y.num ;
}
// 判断身份证是否合法
bool check(string x)
{
	if(x.size() != 18)  return false ;
	int i ;
	for(i = 0 ; i < 18 ; i ++)
	{
		if(x[i] < '0' || x[i] > '9')  return false ;
	}
	return true ;
} 
int main()
{
	int d , p1 , t , s , i , j , k , cnt = 0 ;
	cin >> d >> p1 ; // 几天  间隔时间 
	for(i = 1 ; i <= d ; i ++)  // 每一天 
	{
		cin >> t >> s ; // t条申请 s个口罩
		for(j = 0 ; j < t ; j ++)
		{
			cin >> p[j].name >> p[j].id >> p[j].op >> p[j].time ;
			p[j].num = j ;
		}
		for(j = 0 ; j < t ; j ++)
		{
			if(check(p[j].id)) // 身份证合法  
			{
				//输出有合法记录的、身体状况为 1
				if(p[j].op == 1 && mp2[p[j].id] == 0)
				{
					mp2[p[j].id] = 1 ; // 标记,防止重复输出 
					q[cnt].name = p[j].name ;
					q[cnt].id = p[j].id ;
					cnt ++ ;
				}
			}
		}
		sort(p , p+t , cmp) ;
		for(j = 0 ; j < t ; j ++)
		{
			if(check(p[j].id)) // 身份证合法  
			{
				// 口罩 
				if((mp1[p[j].id] == 0 || (i-mp1[p[j].id] >= p1+1)) && s > 0)
				{
					s -- ; // 口罩减少 
					mp1[p[j].id] = i ;  // 记录拿口罩此时的时间 天 
					cout << p[j].name << " "  << p[j].id << endl ; 
				}
			}
		} 
	}
	for(i = 0 ; i < cnt ; i ++)
	{
		cout << q[i].name << " " << q[i].id << endl ;
	}
	return 0 ;
}

L2-3 完全二叉树的层序遍历

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e3 + 24 , M = 1e3 + 24 ;
int a[N] , ans[N] ;
int n , cnt = 0 ;
void tree(int root)
{
	if(root > n)  return ;
	tree(root*2) ;
	tree(root*2+1) ;
	ans[root] = a[++cnt] ;
}
int main()
{
	int i , j ;
	cin >> n ;
	for(i = 1 ; i <= n ; i ++)  cin >> a[i] ;
	tree(1) ;
	for(i = 1 ; i <= n ; i ++)
	{
		if(i > 1)  cout << " " ;
		cout << ans[i] ;
	}
	return 0 ;
}

L2-4 网红点打卡攻略

这道题大家可以选择看其他博主的文章,我这道题只能得22分,有一个样例始终过不了。

(我还是写出来,思路比较简单,如果你发现了问题,麻烦指正啦!)

#include 
using namespace std ;
typedef long long ll ;
const int N = 1e3 + 24 , M = 1e3 + 24 ;
int g[N][N] ; // 记录两点间的距离 
int d[N] , a[N] , num[N] ; // 记录是否可以到家 

int main()
{
	int n , i , j , k , m , u , v , w , cnt , sum = 0 , ans = 0 , minn = 1e9 , t , first;
	bool flag = true ;
	cin >> n >> m ;
	while(m --)
	{
		cin >> u >> v >> w ;
		g[u][v] = g[v][u] = w ;
		if(u == 0)  d[v] = 1 ;
		if(v == 0)  d[u] = 1 ;
	}
	cin >> k ;
	for(i = 1 ; i <= k ; i ++)
	{
		flag = true ; // 假设满足 
		cnt = 0 , first = 0 , ans = 0 ;
		memset(num , 0 , sizeof(num)) ;
		cin >> t ;
		for(j = 1 ; j <= t ; j ++)
		{
			cin >> a[j] ;
			ans += g[first][a[j]] ;
			first = a[j] ;
			if(num[a[j]] == 0)
			{
				num[a[j]] = 1  ;
				cnt ++ ;
			}
			if((j == 1 || j == t) && d[a[j]] == 0)
			{
				flag = false ;
			}
		}
		ans += g[first][0] ;
		if(t != n || cnt != n)  flag = false ;  
		if(flag)  
		{
			sum ++ ;
			if(ans < minn)  minn = ans , u = i ;
		}
	}
	cout << sum << endl ;
	cout << u << " " << minn ;
	return 0 ;
}

L3我就不写了,我现在的能力写出的答案无法支撑我通过所有得样例,就不拿出来丢人现眼啦,希望后面我能把这部分写出来!最后,如有问题,欢迎指正,一起进步吧!!

你可能感兴趣的:(天梯赛,算法,c++,动态规划,天梯,数据结构)