YCU月赛_2 题解

比赛入口

2019就要过去啦~我们精心为大家准备了一场水题赛~~

这题真的是签到题!!!

做法:表面上看起来是斐波那契,但是一看到数据范围,相信大家都会想到某菜鸡说过的打表找规律。就会发现,n为奇数时输出1,n为偶数时输出-1,最后注意一下大数的输出就可以开心的AC了。

代码

#include
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
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
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
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
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
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
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;
}

你可能感兴趣的:(YCU月赛_2 题解)