目录
一、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 ;
}
真的很讨厌难题,剩下的明天再写