首页 > 编程语言 > 详细

SDUT 2021 Spring Individual Contest - K

时间:2021-05-26 21:29:52      阅读:42      评论:0      收藏:0      [点我收藏+]

A - CRC Test

题解:16进制转二进制,,一位16进制是2的4次方,一位2进制是2的1次方,所以每一位16进制可以看为4位二进制;

题意就是让求16进制转化为2进制后的数除以题目给的那个二进制(题目有说俩个二进制相除是按照异或进行),直到把16进制转化出的二进制每一个数都出完为止,最后余出的数就是答案,这个答案要是k位,如果不够就后补0,,,例如图片中最后答案0111,到0的时候那个1010001101已经除完,所以现在的余数就是答案,因为不够k位所以要在后面补个0,,直接模拟运算就ok

技术分享图片

 

技术分享图片
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
//#include <unordered_map>
//#include <unordered_set>
//#include <bits/stdc++.h>
//#define int long long
#define pb push_back
#define PII pair<int, int>
#define mpr make_pair
#define ms(a, b) memset((a), (b), sizeof(a))
#define x first
#define y second
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int N = 1e6 + 7;
using namespace std;

char str[50], s[5000];
int  answer, goal,MOD;
vector<int> mod, a;
int get10(char ch) {    //获取16进制每一位的数
    if (ch >= 0 && ch <= 9)
        return ch - 0;
    else
        return ch - A + 10;
}
void geta() {    //得到16进制转化为2进制后的数
    int len = strlen(s);
    for (int i = len - 1; i >= 0; i--) {
        int t = get10(s[i]);
        int q = 4;
        while (q--) {
            a.emplace_back(t % 2);
            t = t / 2;
        }
    }          //去掉前导0(这里现在是在后面)
    while (a.size() > 0 && a.back() == 0) a.pop_back();
    reverse(a.begin(), a.end());//vector前面的数代表高位
}
int jisuan() {     //进行计算
    int len = mod.size();
    for (int i = 0; i < len; i++) {
        a[i] = a[i] ^ mod[i];
    }
    reverse(a.begin(), a.end());//去前导0
    while (a.size() > 0 && a.back() == 0) {
        if (goal == answer) break; //控制去的数量
        a.pop_back(), goal++;   
    }
    reverse(a.begin(), a.end()); //再翻转回来
    if (goal == answer) return 1;
    return 0;
}
void solve() {
    while (1) { //进行计算
        if(answer==0)break;  //如果那个16进制转化成2进制后是0
        if (a.size() < mod.size()) {//如果位数不足,要补位
            int t = mod.size() - a.size();
            
            for (int i = 0; i < t; i++) {
                a.emplace_back(0);
            }
        }
        if (jisuan()) break; //如果删除的数足够就退出
    }
    int len = a.size();   //得到现在a的长度,即余数
    for (int i = 0; i < len; i++) {
        printf("%d", a[i]);
    }
    int ttt = MOD - len - 1;
    for (int i = 1; i <=ttt; i++) printf("0");
    printf("\n");
}
int main(int argc, char const *argv[]) {
    int T;
    scanf("%d", &T);
    while (T--) {
        mod.clear();
        a.clear();
        answer = 0;  //代表要删几个前导0,即把这个16进制转化成2进制的位数全部删除
        goal = 0;   //记录现在删了几个了
        scanf("%s", str);
        int len = strlen(str);
        for (int i = 0; i < len; i++) {  
            mod.emplace_back(str[i] - 0);
        }
        MOD=mod.size();  //记录k+1
        reverse(mod.begin(),mod.end());  
        while(mod.size()>0&&mod.back()==0)mod.pop_back(); //去除前导0
        reverse(mod.begin(),mod.end());
        scanf("%s", s);
        geta();   
        answer = a.size(); //得到16进制转化成2机制后的长度
        solve();
    }
    return 0;
}
View Code

F - Batter

题意:给n个电池,每个电池有一个使用时间,给m个地点,每一个地点需要摄像b[i]时间,摄像机在摄像阶段不能换电池,问这些电池最多能摄像几个地方

题解:开俩个优先队列,每次分别拿出两边最小的,进行比较,如果电池时间够用那么就用这个电池摄像,剩余的电量如果大于等于本次摄像时间那么这个电池可能还可以再用一次,就再压入队列

 

技术分享图片
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
//#include <unordered_map>
//#include <unordered_set>
//#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define PII pair<int, int>
#define mpr make_pair
#define ms(a, b) memset((a), (b), sizeof(a))
#define x first
#define y second
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int N = 1e6 + 7;
using namespace std;

// signed main(){
signed main(int argc, char const *argv[]) {
    priority_queue<int, vector<int>, greater<int> > p1, p2;
    int n, m;
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; i++) {
        int data;
        scanf("%lld", &data);
        p1.push(data);
    }
    for (int i = 1; i <= m; i++) {
        int data;
        scanf("%lld", &data);
        p2.push(data);
    }
    // printf("%d\n",p1.top());
    int s = 0;
    while (p1.size() > 0 && p2.size() > 0) {
        int s1 = p1.top();
        p1.pop();
        int s2 = p2.top();
        p2.pop();
        if (s1 >= s2) {
            s1 = s1 - s2;
            if (s1 >= s2) p1.push(s1);
            s++;
        } else {
            while (p1.size() > 0) {
                s1 = p1.top();
                p1.pop();
                if (s1 >= s2) {
                    s1 = s1 - s2;
                    if (s1 >= s2) p1.push(s1);
                    s++;
                    break;
                }
            }
        }
    }
    printf("%lld\n", s);
    return 0;
}
View Code

 

SDUT 2021 Spring Individual Contest - K

原文:https://www.cnblogs.com/Are-you-ready/p/14814097.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!