Codeforces Round #219 (Div. 2) + 元旦欢乐赛

我不是女神ヾ 2022-09-20 15:10 235阅读 0赞

抽出时间补一下做过的题。

Codeforces 373A Collecting Beats is Fun

题意:面板上有16个灯,每个灯会在一个时间量,一只手可以同时关掉k个,问是否可以及时关掉
思路:找到最多的那个,和2*k比较即可

  1. #include <cstdio>
  2. #include <cstring>
  3. char str[10];
  4. int hash[15];
  5. int main ()
  6. {
  7. int k,i;
  8. scanf("%d",&k);
  9. memset(hash,0,sizeof(hash));
  10. for (i=0;i<4;i++)
  11. {
  12. scanf("%s",&str);
  13. for (int j=0;j<4;j++)
  14. if (str[j]!='.')
  15. {
  16. int tmp=str[j]-'0';
  17. hash[tmp]++;
  18. }
  19. }
  20. bool flag=true;
  21. for (i=0;i<10;i++)
  22. if (hash[i]>2*k)
  23. flag=false;
  24. if (flag)
  25. printf("YES\n");
  26. else
  27. printf("NO\n");
  28. return 0;
  29. }

Codeforces 373B Making Sequences is Fun

题意:给出三个整数w,m,k,得到一个数字的代价是这个数字的位数乘以k.总价为w
问你可以得到多少个以m起始的数字序列,这个序列需要是连续的,也就是(m, m+1, m+2, …)
思路:二分列举扩充序列的最后一个整数ans,算出m到ans共有多少个字符num,若是num <= w/k 则接受

  1. #include <cstdio>
  2. #define max(a,b) ((a)>(b)?(a):(b))
  3. __int64 w,m,k;
  4. __int64 bit[20];
  5. void Init ()
  6. {
  7. bit[1]=1;
  8. for (int i=2;i<20;i++)
  9. bit[i]=bit[i-1]*10;
  10. }
  11. int size (__int64 a)
  12. {
  13. int cnt=0;
  14. while (a)
  15. {
  16. cnt++;
  17. a/=10;
  18. }
  19. return cnt;
  20. }
  21. __int64 Cal (__int64 x)
  22. {
  23. __int64 num=0;
  24. while (x>=m)
  25. {
  26. int len=size(x);
  27. __int64 tmp=max(bit[len],m);
  28. num+=(x-tmp+1)*len;
  29. x=tmp-1;
  30. }
  31. return num;
  32. }
  33. int main ()
  34. {
  35. Init ();
  36. while (~scanf("%I64d%I64d%I64d",&w,&m,&k))
  37. {
  38. __int64 ans=m-1;
  39. __int64 left=m,right=1e17,mid;
  40. while (left<=right)
  41. {
  42. mid=(left+right)>>1;
  43. if (Cal(mid)<=w/k)
  44. left=mid+1,ans=mid;
  45. else
  46. right=mid-1;
  47. }
  48. printf("%I64d\n",ans-m+1); //输出个数
  49. }
  50. return 0;
  51. }

Codeforces 373C. Counting Kangaroos is Fun

题意:给出n只袋鼠袋子的大小,若一只袋鼠的袋子的2倍不大于另一个袋鼠袋子的大小,那么大袋鼠就可以装小袋鼠。
每个袋鼠只能装一只袋鼠,且只能装袋子为空的袋鼠,问最少能看到多少只袋鼠。
思路:贪心.显然至少有一半是可以看见的,于是排序后从第一个和中间同时开始向后扫,如果满足2倍关系就同时后移,否则只有中间的后移。

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. const int N=500005;
  5. int data[N];
  6. int main ()
  7. {
  8. int n,i,j;
  9. scanf("%d",&n);
  10. for (i=0;i<n;i++)
  11. scanf("%d",&data[i]);
  12. sort(data,data+n);
  13. int limit=n/2,ans=n;
  14. for (i=0,j=n/2 ; i<limit && j<n;j++)
  15. if (data[i]*2 <= data[j])
  16. {
  17. ans--;
  18. i++;
  19. }
  20. printf("%d\n",ans);
  21. return 0;
  22. }

D和E没搞出来……

元旦时群里组织过一次“元旦欢乐赛”。

比赛链接:https://www.contesthunter.org/contest/%E5%85%83%E6%97%A6%E6%AC%A2%E4%B9%90%E8%B5%9B

我知道这个比赛的时候都已经快结束了……不过还是学到了一些姿势

冒泡排序(优化版)的比较次数和交换数字次数 逆序数+树状数组 - 九野的博客 - 博客频道 - CSDN.NET

发表评论

表情:
评论列表 (有 0 条评论,235人围观)

还没有评论,来说两句吧...

相关阅读

    相关 codeforces-round375-div2

    题目链接:[codeforces round 375 div2][] A题: 读一遍题目就知道是超级水的题目,,就是给你三个坐标,求三个坐标汇集到一个点所走的路程