比赛入口
2019就要过去啦~我们精心为大家准备了一场水题赛~~
这题真的是签到题!!!
做法:表面上看起来是斐波那契,但是一看到数据范围,相信大家都会想到某菜鸡说过的打表找规律。就会发现,n为奇数时输出1,n为偶数时输出-1,最后注意一下大数的输出就可以开心的AC了。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int len = s.size();
if((s[len-1]-'0') % 2) puts("1");
else puts("-1");
return 0;
}
Bobo的火锅宴
做法:判断一个字符串是否是另一个字符串的子串,string类里面有自动的找子串函数,当然一个一个模拟也是能过的(数据出弱了//哭唧唧),注意要用到转义字符输出引号呀。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
string s1, s2;
cin >> s1 >> s2;
if(s1.find(s2) != string::npos)
cout << "\"huo guo zhen hao chi\"." << endl;
else cout << "\"xia ci zai chi ba\"." << endl;
return 0;
}
Bobo要考八级了
做法:给一些字符串排序,主要是想呼吁大家多用sort排序,冒泡,选择那些排序复杂度太高了,在比赛中要小心使用。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
string s[N];
int main() {
int n; cin >> n;
for(int i = 0; i < n; ++i) cin >> s[i];
sort(s, s+n);
for(int i = 0; i < n; ++i) cout << s[i] << endl;
return 0;
}
Lulu爱数学
做法:简单模拟呀,直接对数字拆分就行,每一位每一位拆分。然后这题波佬给出了更优的解法,开始先用字符串输入,进行过一遍操作后直接输出一个公式(sum - 1) % 9 + 1就可。
模拟代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
string s;
int t; cin >> t;
while(t--) {
cin >> s;
int len = s.size();
int sum = 0;
for(int i = 0; i < len; ++i) {
sum += s[i] - '0';
}
while(sum / 10) {
int mid = 0;
while(sum) {
mid += sum % 10;
sum /= 10;
}
sum = mid;
}
cout << sum << endl;
}
return 0;
}
公式代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int t; cin >> t;
string s;
while(t--) {
cin >> s;
int sum = 0, len = s.size();
for(int i = 0; i < len; ++i) {
sum += s[i] - '0';
}
cout << (sum - 1) % 9 + 1 << endl;
}
return 0;
}
洛洛的周末约会
做法:按右端点排序,再遍历一遍,判断下一个的左端点和上一个是否有重合部分。
代码:
#include<bits/stdc++.h>
using namespace std;
struct node {
int l, r;
bool operator < (const node &a) const { //重载运算符达到cmp比较函数的效果
return r == a.r ? l < a.l : r < a.r;
}
}e[120];
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> e[i].l >> e[i].r;
}
sort(e, e + n);
int la = e[0].r, cnt = 1;
for(int i = 1; i < n; i++) {
if(e[i].l >= la) {
la = e[i].r;
cnt++;
}
}
cout << cnt << endl;
}
Lulu的p_二进制数
做法:从CF里拷出来的一题,思维题,暴力枚举答案就行,答案是循环中间变量i,那么要满足n - p *i化为二进制中1的个数,如果小于等于了i,那么最小的就是结果拉。
代码:
#include<bits/stdc++.h>
using namespace std;
int check(int x) {
int cnt = 0;
while(x) {
if(x % 2) cnt++;
x >>= 1;
}
return cnt;
}
int main() {
int n, p;
scanf("%d%d", &n, &p);
for(int i = 1; p * i <= n; ++i) {
if(check(n - p * i) <= i && n - p * i >= i) {
cout << i << endl; return 0;
}
}
cout << -1 << endl;
return 0;
}