一些思维题记(长期更新)

A. Prime Subtraction Codeforces 1238A

题意: 给出两个数 A , B A,B A,B,询问 ∣ A − B ∣ |A-B| AB是否是素数的倍数。
思路:
这题涉及一点小数论,每个数都能进行质因数分解(除了1),所以只要A-B不为1就输出YES,否则输出NO

B. Kill 'Em All 1238B

题意:
在坐标 x x x的地方扔炸弹,位于 x x x的地方的怪会直接去世,若不位于,则会被爆炸冲击波击退 k k k个单位

思路: 排序去重,从最大的 x x x开始扔炸弹即可。

C. Standard Free2play (模拟)

题意: 一个人位于 h h h的板子上,通过一些操作(拉动拉杆,使得 h 和 h − 1 h和h-1 hh1的踏板状态改变,如果原来是出来的,现在收回去),或者通过使用石头使得任意的踏板改变状态,达到高度 0 0 0,问最小用多少个石头。

思路: 如果直接模拟h (1e9)会超时,注意到告诉你踏板的状态只有n(1e5),于是就从这个角度入手。
看下一个踏板的高度和当前高度,如果说下一个踏板的高度不是 n o w H e i g h t − 1 nowHeight-1 nowHeight1,那么可以直接从 h h h高度跳到 H n x t − 1 H_{nxt}-1 Hnxt1,反之需要判断以下,具体看代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
int arr[maxn];
int main()
{
   
    int q;  cin >> q;
    while(q--){
   
        int h,n;    cin >> h >> n;
        for(int i = 0; i < n; ++i){
   
            cin >> arr[i];
        }
        int now = h,ans = 0;
        for(int i = 1; i < n;){
   
            if(now<=2)  break;
            if(arr[i]==now-1){
   
                if(i+1 < n&&arr[i+1]==now-2){
   
                    i+=2;   now = now-2; continue;   // 到下一个
                }else{
   
                    ++ans,now = now-2,++i;
                }
            }else if(arr[i]!=now-1){
   
                now = arr[i]+1;
            }
        }
        cout << ans << endl;
    }
    return 0;
}

D. AB-string 1238D
去除掉 “AAAAB",“BBBBA” 类似的情况就可以了。

C. Registration system

思路:map记录即可。

#include <bits/stdc++.h>
using namespace std;
map<string,int> mp;
int main()
{
   
	int n;	cin >> n;
	for(int i = 0; i < n; ++i){
   
		string str;	cin >> str;
		if(!mp.count(str)){
   
			cout << "OK" << endl;
			mp[str]++;
		}else{
   
			cout << str << mp[str]++ << endl;
		}
	}
	return 0;
}

A. Two Substrings
题意:问字符串里有没有 A B AB AB, B A BA BA
思路:暴力乱搞

#include <bits/stdc++.h>
using namespace std;
map<string,int> mp;
int main()
{
   
	string str;	cin >> str;
	bool isok1 = false,isok2 = false;
	for(int i = 0,n = str.size(); i < n; ++i){
   
		if(i+1<n && str[i]=='A' && str[i+1]=='B'){
   
			for(int j = i+2; j < str.size(); ++j){
   
				if(j+1 < n&& str[j]=='B' && str[j+1]=='A'){
   
					cout << "YES" << endl;
					return 0;
				}
			}
		}
		else if(i+1<n && str[i]=='B' && str[i+1]=='A'){
   
			for(int j = i+2; j < str.size(); ++j){
   
				if(j+1 < n&& str[j]=='A' && str[j+1]=='B'){
   
					cout << "YES" << endl;
					return 0;
				}
			}			
		}
	}
	cout << "NO" << endl;
	return 0;
}

B. Minimum Ternary Strings

思路:可以发现1的位置是任意的,所以贪心的考虑即可

#include <bits/stdc++.h>
using namespace std;
int main(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值