零点工作室暑假集训(AtCoder--ABC309)

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值