A - Nine
题意:有一个3×3的方格板,上面写着从1到9的整数。现在给定两个整数A和B,它们都在1到9之间,并且A小于B。你需要确定标有A和B的两个方格是否在水平方向上相邻。
思路:若2个数在同一行输出Yes即可
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 200010 , INF = 0x3f3f3f3f , Mod = 998244353;
int a, b;
int main()
{
cin >> a >> b;
if(a <= 3 && b <= 3)
{
cout << "Yes";
return 0;
}
if(a > 3 && a <= 6 && b > 3 && b <= 6)
{
cout << "Yes";
return 0;
}
if(a > 6 && a <= 9 && b > 6 && b <= 9)
{
cout << "Yes";
return 0;
}
cout << "No";
return 0;
}
B - Rotate
题意:你有一个拥有N行和N列的方格。每个方格上都写有整数Ai,j,其中i表示从顶部开始的行号,j表示从左边开始的列号。保证Ai,j要么是0,要么是1。
思路:创建一个与原方格相同大小的新方格。
1.遍历原方格中的每个方格。
2.如果当前方格不是外侧方格(即不在第一行、最后一行、第一列或最后一列),将其值复制到新方格对应的位置。
3.如果当前方格是外侧方格,确定它在移动后的新位置。
4.如果在第一行,新位置将为(row=2, column=j+1)。
5.如果在最后一行,新位置将为(row=N-1, column=j-1)。
6.如果在第一列,新位置将为(row=i+1, column=2)。
7.如果在最后一列,新位置将为(row=i-1, column=N-1)。
8.将当前方格的值复制到新位置在新方格中的位置。
9.打印出结果的方格。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 110 , INF = 0x3f3f3f3f , Mod = 998244353;
int n;
char a[N][N], b[N][N];
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= n; j ++)
{
cin >> a[i][j];
b[i][j] = a[i][j];
}
}
for(int j = 2; j <= n; j ++)
{
b[1][j] = a[1][j - 1];
}
for(int i = 2; i <= n; i ++)
{
b[i][n] = a[i - 1][n];
}
for(int j = n - 1; j >= 1; j --)
{
b[n][j] = a[n][j + 1];
}
for(int i = n - 1; i >= 1; i --)
{
b[i][1] = a[i + 1][1];
}
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= n; j ++)
{
cout << b[i][j];
}
cout << endl;
}
return 0;
}
C - Medicine
题意:Snuke医生给Takahashi开了N种药物的处方。在接下来的ai天(包括开药那天),他需要每天服用第i种药物bi颗。他不需要服用其他任何药物。假设开药那天为第1天。在第1天或之后,他第一次需要服用K颗药物或更少的那天是哪天?
思路:因为数据过大不可直接使用简单的数组储存数据会TLE的,可以使用vector a(n + 1);储存,有效的降低了时间复杂度,将数据排序后,使用sum将他们的和相加,看哪一天的药片数量 <= K,输出天数
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int , int> PII;
const int N = 200010 , INF = 0x3f3f3f3f , Mod = 998244353;
int main()
{
int n , k;
cin >> n >> k;
vector<PII> a(n + 1);
LL sum = 0;
for(int i = 1 ; i <= n ; i ++ ) cin >> a[i].first >> a[i].second , sum += a[i].second;
sort(a.begin() + 1 , a.end());
for(int i = 1 ; i <= n ; i ++ )
{
if(sum <= k)
{
cout << a[i - 1].first + 1 << endl;
return 0;
}
sum -= a[i].second;
}
cout << a[n].first + 1 << endl;
return 0;
}