1. 程式人生 > >2018 計蒜之道 初賽 第四場題解 未完結

2018 計蒜之道 初賽 第四場題解 未完結

A.題目連結
Analysis:
對於任何一個如題的浮點數,唯有我當前識別的數為4才會受後一位影響
~~~當然你要注意|Y|表示長度超1000位,我會告訴你我第一份妄想FB的程式碼是直接 > 444 的嘛 )辣雞出題人
Code

#include <iostream>
#include <cstdio>
#include <cmath>;
using namespace std;

template <class T>
inline void scan_d(T &ret) {
    char c; ret=0
; int t ; while((c=getchar())<'0'||c>'9'); while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar(); c=getchar(); while(c>='0'&&c<='9'){ t = c - '0'; if( t == 4 ) c=getchar(); else { if( t > 4 ) ret++; cin
.ignore(1001,'\n'); break; } } } template <class T> inline void out(T x) { if(x>9) out(x/10); putchar(x%10+'0'); } int main() { int T; cin >> T; long long x; while (T--) { scan_d(x); out(x); cout<<endl; } return
0; }

B.題目連結

Analysis:
這道題暴力即可,使用全排列匹配過去就好了
這裡講解一下我的做法,由於題目要求的是集合,那麼也就是無序的,第一反應是排序使之升序以匹配(桶排序正好),然後索性就把值加起來唄-。-二進位制來驗證值是否相同就來了///

Bin_Sort原理

如圖,我當前得到的序列是{3,5},那麼sum = 00010100。我在全排列中找連續的兩位獲取他們的二進位制和,異或 或者 或運算 就好

Code

bool match(const string &s, const string &templet) {
    int bit_s = 0, bit_templet = 0;
    int size = s.length();
    for (int i = 0; i < size; ++i) 
        bit_s |= (1 << (s[i]-'0' - 1)), bit_templet |= (1 << (templet[i]-'0' - 1));

    if (!(bit_s ^ bit_templet))  return true;
    for (int i = size; i < templet.size(); ++i) {
        bit_templet ^= (1 << (templet[i - size] -'0' - 1)), bit_templet |= (1 << (templet[i] -'0' - 1));
        if (!(bit_s ^ bit_templet)) return true;
    }
    return false;
}   

作為蒟蒻,我直接看的input然後快寫完了,才回過頭看見是set.快誇獎我~所以你們不要像我用map儲存string,直接 vector< int,vec<int> > (最好寫個空格~)或者 int[][] 皆可
分享下我的提交:
1. 有序的判斷- 40 分
2. 有序的判斷改成雙向匹配 - 90分
3. 位運算 - AC

C.