2018 計蒜之道 初賽 第四場題解 未完結
阿新 • • 發佈:2019-02-11
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:
這道題暴力即可,使用全排列匹配過去就好了
這裡講解一下我的做法,由於題目要求的是集合,那麼也就是無序的,第一反應是排序使之升序以匹配(桶排序正好),然後索性就把值加起來唄-。-二進位制來驗證值是否相同就來了///
如圖,我當前得到的序列是{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.