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

目录

一、L1-1 今天我要赢

二、L1-2 种钻石

三、L1-3 谁能进图书馆

四、L1-4 拯救外星人

五、L1-5 试试手气

六、L1-6 斯德哥尔摩火车上的题

七、L1-7 机工士姆斯塔迪奥

八、L1-8 静静的推荐

九、L2-1 插松枝

十、L2-2 老板的作息表

十一、L2-3 龙龙送外卖

十二、L2-044 大众情人

一、L1-1 今天我要赢

#include <bits/stdc++.h>
using namespace std ;
int main()
{
	cout << "I'm gonna win! Today!" << endl ;
	cout << "2022-04-23" ;
	return 0 ;
}

二、L1-2 种钻石

#include <bits/stdc++.h>
using namespace std ;
int main()
{
	int n , v ;
	cin >> n >> v ;
	cout << n / v ;
	return 0 ;
}

三、L1-3 谁能进图书馆

比较简单,思路保持清晰即可,判断能独自进去的->都不能进去->两个人都可以进但不是必须一起的(再分是谁带谁)->一个人能进一个不能(再分是1、2哪个能进)

#include <bits/stdc++.h>
using namespace std ;
int main()
{
	int n , m , a , b ;
	cin >> n >> m >> a >> b ;
	if(a >= n && b >= n)
	{
		printf("%d-Y %d-Y\n" , a , b ) ;
		printf("huan ying ru guan") ;
	}
	else if(a < n && b < n)
	{
		printf("%d-N %d-N\n" , a , b ) ;
		printf("zhang da zai lai ba") ;
	}
	// 两个人都可以进但不是必须一起的
	// b带a 
	else if(a < n && b >= m)
	{
		printf("%d-Y %d-Y\n" , a , b ) ;
		printf("qing 2 zhao gu hao 1") ;
	}
	// a 带b
	else if(a >= m && b < n)
	{
		printf("%d-Y %d-Y\n" , a , b ) ;
		printf("qing 1 zhao gu hao 2") ;
	} 
	// 如果一个人能进一个不能
	// a能进去
	else if(a >= n && b < n)
	{
		printf("%d-Y %d-N\n" , a , b ) ;
		printf("1: huan ying ru guan") ;
	} 
	// b能进去
	else if(a < n && b >= n)
	{
		printf("%d-N %d-Y\n" , a , b ) ;
		printf("2: huan ying ru guan") ;
	}  
	return 0 ;
}

四、L1-4 拯救外星人

算阶乘,记得开 long long

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int N = 1e3 + 24 ;

int main()
{
	ll a , b , ans = 1 , i , j ;
	cin >> a >> b ;
	for(i = 1 ; i <= a+b ; i ++)
	{
		ans *= i ;
	}
	cout << ans ;
	return 0 ;
}

五、L1-5 试试手气

这道题很有趣,用了一个标记数组v[][], v[i][a[i]]-> 第i个位置a[i]这个数是否已经出现过,如果出现了就a[i]--,因为始终要在条件的限制下保持最大。

网上还有另一种做法,我有点理解不了,我感觉自己这个还不错,比较好理解哈哈

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int N = 1e3 + 24 ;
int a[10] ;
int v[10][10] ; // 标记 
int main()
{
	int n , i , j ;
	for(i = 1 ; i <= 6 ; i ++)  
	{
		cin >> a[i] ;
		v[i][a[i]] = 1 ;
		a[i] = 6 ;
	}
	cin >> n ;
	while(n --)
	{
		for(i = 1 ; i <= 6 ; i ++)
		{
			while(v[i][a[i]] == 1)  a[i] -- ;
			v[i][a[i]] = 1 ;
		}
	}
	for(i = 1 ; i <= 6 ; i ++)
	{
		if(i > 1)  cout << " " ;
		cout << a[i] ;
	}
	return 0 ;
}

六、L1-6 斯德哥尔摩火车上的题

这道题题目意思很明确,一步一步来就行

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int N = 1e4 + 24 ;
char s1[N] , s2[N] ;  // 原字符串
char a[N] , b[N] ; // 存储结果字符串 
int main()
{
	int i , j , len1 , len2 , cnt1 = 0 , cnt2 = 0 ;
	cin >> s1 ;
	getchar() ;
	cin >> s2 ;
	len1 = strlen(s1) , len2 = strlen(s2) ;
	//先计算 s1 的结果  -> a[cnt1] 
	for(i = 1 ; i < len1 ; i ++)
	{
		if((s1[i]-'0') % 2 == (s1[i-1]-'0') % 2)
		{
			a[cnt1++] = max(s1[i] , s1[i-1]) ;
		}
	} 
	//计算 s2 的结果  -> b[cnt2] 
	for(i = 1 ; i < len2 ; i ++)
	{
		if((s2[i]-'0') % 2 == (s2[i-1]-'0') % 2)
		{
			b[cnt2++] = max(s2[i] , s2[i-1]) ;
		}
	}
	bool flag = true ;
	if(cnt1 != cnt2)
	{
		flag = false ; // 不一样 
	}
	else
	{
		for(i = 0 ; i < cnt1 ; i ++)
		{
			if(a[i] != b[i])
			{
				flag = false ; // 不一样
				break ; 
			}
		}
	}
	if(flag) //一样 
	{
		cout << a ; 
	}
	else // 不一样 
	{
		cout << a << endl ;
		cout << b ;
	}
	return 0 ;
}

七、L1-7 机工士姆斯塔迪奥

很喜欢暴力,不用动脑子真好

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int N = 1e3 + 24 ;

int main()
{
	int n , m , q , t , c , ans = 0 , i , j ;
	cin >> n >> m >> q ;
	int a[n][m] ;
    memset(a , 0 ,sizeof(a)) ;
	while(q --)
	{
		cin >> t >> c ;
		if(t == 0) // 行 
		{
			for(i = 0 ; i < m ; i ++)
			{
				a[c-1][i] = 1 ;
			} 
		}
		else if(t == 1) // 列 
		{
			for(i = 0 ; i < n ; i ++)
			{
				a[i][c-1] = 1 ;
			} 
		}
	}
	for(i = 0 ; i < n ; i ++)
	{
		for(j = 0 ; j < m ; j ++)
		{
			if(a[i][j] == 0)  ans ++ ;
		}
	}
	cout << ans ;
	return 0 ;
}

八、L1-8 静静的推荐

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int N = 1e4 + 24 ;
int num[250] ; // 某个分数出现了几次 

int main()
{
	int n , k , s , cnt = 0 , n1 , n2 ;
	cin >> n >> k >> s ;
	while(n --)
	{
		cin >> n1 >> n2 ;
		if(n1 >= 175)
		{
			if(n2 >= s)  cnt ++ ;
			else
			{
				num[n1] ++ ;
				if(num[n1] <= k)  cnt ++ ;
			}
		}
	}
	cout << cnt ;
	return 0 ;
}

九、L2-1 插松枝

这题我得研究一下,有个案例始终过不了...

十、L2-2 老板的作息表

结构体排序,时间从小到大,没有就填上,注意首尾

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int N = 1e5 + 24 , M = 1e3 + 24 ;
int a[14] ;
struct point{
	string begin ;
	string end ;
}p[N];
bool cmp(point x , point y)
{
	return x.begin < y.begin ;
}
int main()
{
	int n , i , j , k ;
	string s ;
	cin >> n ;
	for(i = 0 ; i < n ; i ++)
	{
		cin >> p[i].begin >> s >> p[i].end ;
	}
	sort(p , p+n , cmp) ;
	string first = "00:00:00";
	for(i  = 0 ; i < n ; i ++)
	{
		
		if(p[i].begin != first)
		{
			cout << first << " - " << p[i].begin << endl ;;
		}
		first = p[i].end ;
	}
	if(first != "23:59:59")  cout << first << " - 23:59:59" ;
	return 0 ; 
}

十一、L2-3 龙龙送外卖

等我再研究研究...

十二、L2-044 大众情人

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int N = 5e2 + 24 , M = 1e9 + 24 ;
int g[N][N] ;
int sex[N] , d[N];
int main()
{
	int n , i , j , k , w ;
	char c ;
	cin >> n ;
	// 初始化距离 
	for(i = 1 ; i <= n ; i ++)
	{
		for(j = 1 ; j <= n ; j ++)
		{
			if(i == j)  g[i][j] = 0 ;
			else  g[i][j] = M ;
		}
	}
	for(i = 1 ; i <= n ; i ++)
	{
		cin >> c ;  // 性别
		if(c == 'F')  sex[i] = 1 ; // 女生为1
		else if(c == 'M')  sex[i] = 2 ; // 男生为2
		cin >> k ;
		while(k --)
		{
			scanf("%d:%d" , &j , &w) ;
			g[i][j] = w ; //i这个人对该朋友j的距离感
		} 
	}
	// 用佛洛依德求最小距离
	for(k = 1 ; k <= n ; k ++)
	{
		for(i = 1 ; i <= n ; i ++)
		{
			for(j = 1 ; j <= n ; j ++)
			{
				g[i][j] = min(g[i][j] , g[i][k]+g[k][j]) ;
			}
		}
	} 
	// 求异性中对i的最大值
	for(i = 1 ; i <= n ; i ++)
	{
		for(j = 1 ; j <= n ; j ++) //  
		{
			// 首先j得是i的异性,在所有异性中找出j到i的最大值即g[j][i],而不是i到j的 
			if(sex[i] != sex[j])  d[i] = max(d[i] , g[j][i]) ;
		}
	} 
	// 找女、男中的大众情人对应的d距离,即最小值
	int d1 = M , d2 = M ; // d1->女,d2->男
	for(i = 1 ; i <= n ; i ++)
	{
		if(sex[i] == 1)  d1 = min(d1 , d[i]) ;
		if(sex[i] == 2)  d2 = min(d2 , d[i]) ;
	} 
	// 女大众情人
	int cnt = 0 ;
	for(i = 1 ; i <= n ; i ++)
	{
		if(d[i] == d1 && sex[i] == 1)
		{
			cnt ++ ;
			if(cnt > 1)  cout << " " ;
			cout << i ;
		}
	}
	cout << endl ;
	// 男大众情人
	cnt = 0 ;
	for(i = 1 ; i <= n ; i ++)
	{
		if(d[i] == d2 && sex[i] == 2)
		{
			cnt ++ ;
			if(cnt > 1)  cout << " " ;
			cout << i ;
		}
	}
	return 0 ;
} 

真的很讨厌难题,剩下的明天再写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值