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.