程序笔记   发布时间:2022-07-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Codeforces#741div2大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

A-The Miracle and the Sleeper

题目描述

给你两个整数 l,r,请你找出所有数对(a,b)中,使得 a % b 结果最大的数对。其中 r >= a >= b >= l 输入描述 每个测试样例有多组数据,第一行会输入一个 t (1<= t <= 1e4),代表数据个数。接下来的每一行,会输入两个整数 l,r (1 <= l <= r <= 1e9) 输出描述 对于每一个测试数据,输出 a % b 的最大值。 原题链接


输入样例

4
1 1
999999999 1000000000
8 26
1 999999999

输出结果

0
1
12
499999999

解题思路

对于一个数对(a,b),当 a = 2b - 1时,a % b 的结果最大为 b - 1(此时认为 a 可以为任意值),但题目中 a 最大为 r,所以当 b = r/2 + 1时,能取到最大值,又由于 b 要大于等于 l,所以当 r/2 + 1小于 l 时,就让 b = l 即可,此时增大 b 的值并不会改变结果。

AC代码

#include <iostream>
using namespace std;

int main(){
    int l,r,a,b,t;
    scanf("%d",&t);
    while(t--){
        scanf("%d %d",&l,&r);
        a = r,b = r/2 + 1;
        if(b < l) b = l;
        cout << a % b << endl;
    }
    return 0;
}

B-Scenes From a Memory

题目描述

给定一个数(确保每一位数字都不为0),你可以删除其中的任意个数字,删除任意个数字后,得到一个新的数,确保剩下这个数不是质数,请尽可能的删除越多的数字输出剩下的数字。(确保一定有结果) 输入描述 先输入一个整数 t (1 <= t <= 1e3),代表有 t 组测试数据,对于每一组测试数据,第一行输入一个 n (1 <= n <= 50) ,代表接下来输入的数的位数,第二行为输入的数s。 输出描述 对于每一个测试数据,第一行输出这个新的数有几位数,第二行输出这个数


解题思路

由于位数比较多所以用字符串储存数s,对于给定的数,只要这个数中出现了”1,4,6,8,9“,中的任意一个数字,我们就可以把这个数的其他数字全部删除,只留下这一位。若这个数不含有上面的数字,我们可以统计一下分别出现了多少次“2,3,5,7”,如果其中有一个出现了两次以上,那么我们就保留两个这个数,其他数字删掉。如果没有任何一个数字出现了两次以上,那么 n <= 4 ,就直接dfs(),挨个判断选中的数是不是素数就行了。

AC代码

#include <iostream>
#include <cstring>
using namespace std;
char num[55];
int cnt[11],t,n,value,ans,idx;
bool st[4],flag;
bool is_prime (int x){
    if(x == 1) return false;
    if(x == 0 || x == 2 || x == 3) return true;
    if(x % 6 == 5 || x % 6 == 1){
        for(int i = 2; i <= x / i; i++)
            if(x % i == 0)  return false;
    }
    else return false;
    return true;
}
void dfs(int x){
    for(int i = x; i < n; i++){
        if(!st[i]){
            st[i] = true;
            value = value * 10 + num[i] - '0';
            if(!is_prime(value)) ans = min(ans,value);
            dfs(i+1);
            value /= 10;
            st[i] = false;
        }
    }
}
int main(){
    scanf("%d",&t);
    while(t--){
        idx = 0,flag = false,value = 0,ans = 10000;
        memset(cnt,0,sizeof(cnt));
        memset(st,false,sizeof(st));
        scanf("%d",&n);
        scanf("%s",&num);
        for(int i = 0; i < n; i++){
            if(num[i] != '2' && num[i] != '3' && num[i] != '5' && num[i] != '7'){
                cout << 1 << endl << num[i] << endl;
                flag = true;
                break;
            }
            cnt[num[i]-'0']++;
        }
        if(flag) continue;
        if(cnt[2] > 1) {cout << 2 << endl << 22 << endl;continue;}
        if(cnt[3] > 1) {cout << 2 << endl << 33 << endl;continue;}
        if(cnt[5] > 1) {cout << 2 << endl << 55 << endl;continue;}
        if(cnt[7] > 1) {cout << 2 << endl << 77 << endl;continue;}
        dfs(0);
        int temp = ans;
        while(temp != 0) temp /= 10,idx++;
        cout << idx << endl << ans << endl;
    }
    return 0;
}

C-Rings

题目描述

给你一个长度为 n 的二进制数s,(2 <= n <= 2e4),请你找的((l_1),(r_1)),((l_2),(r_2)), t 为从 s 的第 (l_1)位截取到第(r_1)位所得到的二进制数转换成的十进制数,w 为从 s 的第 (l_2)位截取到第(r_2)位所得到的二进制数转换成的十进制数

大佬总结

以上是大佬教程为你收集整理的Codeforces#741div2全部内容,希望文章能够帮你解决Codeforces#741div2所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: