Codeforces Round #666 Div. 2

contest1397

A.Juggling Letters

对每个字母进行计数,看是否能整除n

  #include <iostream>
  #include <algorithm>
  #include <cstdio>
  #include <cmath>
  #include <cstring>
  using namespace std;
  typedef long long ll;
  const ll mod = 1e4;
  int cnt[26] = {};
  int main(){
  	      ll n;
  	      cin >> n;
      while (n--)
      {
	      int b,d;
	      cin >> b;
	      d = b;
	      string k;
	      memset(cnt, 0, sizeof(cnt));
	      while (b--)
	      {
		      cin >> k;
		      for (int i = 0; i < k.length(); i++) {
		      	      cnt[k[i]-'a']++;
		      }
	      }
	      int flag = 0;
	      for (int i = 0; i < 26; i++) {
		      if (cnt[i] % d)flag = 1;
	      }
	      if (flag)cout << "NO\n";
	      else cout << "YES\n";
      }
  }

B.Power Sequence

cost是从大到小再到大的,从1开始依次枚举c,只要cost大于前一个值就break。(打的时候脑子抽了,以为这样复杂度会爆炸,就一直一直再乱写。。。)

  #include <iostream>
  #include <algorithm>
  #include <cstdio>
  #include <cmath>
  #include <cstring>
  using namespace std;
  typedef long long ll;
  const ll mod = 1e5 + 5;
  ll INF = 1e18;
  int dataa[mod] = {};
  int min(int b, int a) { if (a > b)return b; return a; }
  int main(){
      ll n;
      cin >> n;
      for (int i = 0; i < n; ++i) {
	      scanf("%d", &dataa[i]);
      }
      sort(dataa, dataa + n);
      ll ans =0;
      for (int i = 0; i < n; ++i) {
	      ans += llabs(dataa[i] - 1);
      }
      ll c = 2;
      while (1)
      {
	      ll temp = 0;
	      ll b = 1;
	      for (int i = 0; i < n; i++) {
		      temp += llabs(dataa[i] - b);
		      if (temp > ans)break;//如果temp已经超过ans了就直接break,防止爆long long
		      b *= c;
	      }
	      if (temp > ans)break;
	      ans = min(ans, temp);
	      c++;
      }
      cout << ans;

  }

C. Multiples of Length

首先给1到n-1的数每个加上他们自身的n-1倍
再给1到n的数减去他们自身的n倍(第n个数减去0)
最后给第n个数减去1乘以他自身

  #include <iostream>
  #include <algorithm>
  #include <cstdio>
  #include <cmath>
  #include <cstring>
  using namespace std;
  typedef long long ll;
  const ll mod = 1e5 + 5;
  ll INF = 1e18;
  int dataa[mod] = {};
  int min(int b, int a) { if (a > b)return b; return a; }
  int main()
  {
      ll n;
      cin >> n;
      for (int i = 0; i < n; ++i) {
	      scanf("%d", &dataa[i]);
      }
      if (n != 1) {
	      cout << 1 << ' ' << n - 1 << '\n';
	      for (int i = 0; i < n - 1; i++) {
		      cout << dataa[i] * (n - 1);
		      cout << ' ';
	      }
	      cout << '\n';
	      cout << 1 << ' ' << n << '\n';
	      for (int i = 0; i < n - 1; i++) {
		      cout << dataa[i] * n * -1;
		      cout << ' ';
	      }
	      cout << 0;
	      cout << '\n';
	      cout << n << ' ' << n << '\n';
	      cout << -1 * dataa[n-1];
      }
      else
      cout << "1 1\n0\n1 1\n0\n1 1\n" << -1 * dataa[0];
  }

D.Stoned Game

每个人不能选前一次对手选的石堆,那最优情况就是先手选当前局面中最大的石堆。如果有一个石堆比其他所有石堆之和都大,那先手一直选那个石堆即可。如果没有,因为我们每次选的都是当前最大的石堆,每个石堆均匀消耗,判断总石子的奇偶性即可。

  #include <iostream>
  #include <algorithm>
  #include <cstdio>
  #include <cmath>
  #include <string>
  #define lc(i) (2*i+1)
  using namespace std;
  typedef long long ll;
  const ll mod = 1e6 + 1e6+5;
  ll INF = 1e18;
  ll ans = 0;
  int dataa[mod] = {}; 
  int tmpa[mod] = {};
  int min(int b, int a) { if (a > b)return b; return a; }
  int max(int a, int b) { if (a > b)return a; return b;}
  int main(){
      ll n;
      cin >> n;
      while (n--)
      {
	      ll m;
	      cin >> m;
	      for (int i = 0; i < m; i++)scanf("%d", &dataa[i]);
	      ll sum = 0;
	      ll mx = 0;
	      for (int i = 0; i < m; i++) {
		      sum += dataa[i];
		      mx = max(dataa[i], mx);
	      }
	      if (sum - mx < mx)cout << "T\n";
	      else {
		      if (sum % 2==0)cout << "HL\n";
		      else cout << "T\n";
	      }

      }

  }
posted @ 2020-09-01 01:45  PopHirasawa  阅读(188)  评论(0编辑  收藏  举报