Codeforces Round #530 (Div. 2) (前三题题解)

总评

今天是个上分的好日子,可惜12:30修仙场并没有打。。。

A. Snowball(小模拟)

我上来还以为直接能O(1)算出来没想到还能小于等于0的时候变成0,那么只能小模拟了。从最高的地方进行高度的模拟,如果遇到石头就去判断一下会不会小于0其他没有什么好说的了

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int a,b,c,d,e,f;
  cin>>a>>b>>c>>d>>e>>f;
  for(int i=b;i>=0;i--)
  {
    a+=i;
    if(d==i)
    {
      a-=c;
      if(a<=0)
      a=0;
    }
    else if(f==i)
    {
      a-=e;
      if(a<=0)
      a=0;
    }
  }
  cout<<a;
}

B. Squares and Segments(数学)

题目真是贼长啊,实际上就是找到最小的边能够映射成给定的正方形。上来我直接被样例的4给昏迷了,怎么还能4条边围成4个正方形,实际上2*2就可以

进而想到了如果这个正方形的个数是个完全平方数那么就是sqrt(n)*2

然后进行了一次推敲,如果不是完全平方数那么就用原本的个数减去最近的完全平方数然后去凑列,也就是说看差值能凑成多少最近的完全平方数的行的列,然后加上这些列就是边数

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int t;
  cin>>t;
  if(sqrt(t)==int(sqrt(t)))
  cout<<sqrt(t)*2;
  else
  cout<<int(sqrt(t))*2+(t-int(sqrt(t))*int(sqrt(t)))/int(sqrt(t))+(t%int(sqrt(t))!=0);
}

C. Postcard (字符串基础)

这个地方真的是语法上有太多的漏洞,当时直接看了c++一半就来了。。。语法漏洞还是比较多。用了string类的erase后续的会向前移并且坐标也会前移,也就是说你erase了两个然后坐标又前移了两个,如果继续遍历的话会出错必须把坐标改回来

然后我们来看看具体的情况有多少

首先要看看特例也就是不可能的情况

(1)如果去掉标记的字符还不能达到给定的长度,那么不可能

(2)如果没有*但是长度比原本的字符的长度长那么不可能

然后我们再去算可能的

(1)去掉型,去掉合适的然后能够得到答案

(2)增加型,存在。先把?的标记都去掉然后把第一个增加去掉其他的*即可

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  string a;
  cin>>a;
  int len,ans=0,f=0;
  cin>>len;
  for(int i=0;i<a.size();i++)
  {
    if(isalpha(a[i]))
    ans++;
    else if(a[i]==‘*‘)
    f++;
  }
  int mk=a.size()-ans;
  if(ans-mk>len||(ans<len&&!f))
  return cout<<"Impossible",0;
  if(ans-mk<=len&&ans>=len)
  {
    int re=ans-len;
    int now=1;
    for(int i=0;i<a.size();i++)
    {
      if(!isalpha(a[i]))
      {
        if(now<=re)
        now++,a.erase(i-1,2),i-=1;
        else
        a.erase(i,1);
      }
    }
    cout<<a;
  }
  if(ans<len)
  {
    for(int i=0;i<a.size();i++)
    if(a[i]==‘?‘)
    a.erase(i-1,2),i-=1;
    int te=a.size()-f;
    for(int i=0;i<a.size();i++)
    if(a[i]==‘*‘)
    {
      a.erase(i,1);
      if(te<len)
      a.insert(i,len-te,a[i-1]),te=len;
    }
    cout<<a;
  }
}

原文地址:https://www.cnblogs.com/baccano-acmer/p/10230327.html

时间: 2024-07-28 14:54:39

Codeforces Round #530 (Div. 2) (前三题题解)的相关文章

BestCoder Round #11 (Div. 2) 前三题题解

题目链接: huangjing hdu5054 Alice and Bob 思路: 就是(x,y)在两个參考系中的表示演全然一样.那么仅仅可能在这个矩形的中点.. 题目: Alice and Bob Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 216    Accepted Submission(s): 166 Problem De

Codeforces Round #530 (Div. 2):D. Sum in the tree (题解)

D. Sum in the tree 题目链接:https://codeforces.com/contest/1099/problem/D 题意: 给出一棵树,以及每个点的si,这里的si代表从i号结点到根节点的权值和.但是有些si=-1,这就相当于丢失了当前结点的数据. 假设原本每个点的权值为ai,那么现在求sum{ai}的最小为多少,ai为非负数. 题解: 这题可以单独看每一条链上的s值,假设当前结点为u,儿子结点v,那么就有几种情况: 1.su==-1&&sv==-1,这种不用管,继

Codeforces Round #530 (Div. 2)F Cookies (树形dp+线段树)

题:https://codeforces.com/contest/1099/problem/F 题意:给定一个树,每个节点有俩个信息x和t,分别表示这个节点上的饼干个数和先手吃掉这个节点上一个饼干的的时间.然后有先手和后手俩个人. ?先手可以这么操作:在规定总时间T到达某个节点然后一定要返回根节点1,期间可以选择吃掉某些节点上的某些饼干(前提是保证剩下的时间能够回到根节点): ?后手可以这么操作:在先手到达的位置和这个位置的孩子之间的连边选择一条让先手吃得更多的边摧毁掉,也可以跳过这个过程: 问

Codeforces Round #315 (Div. 2) (ABCD题)

A. Music 题意: 一首歌长度为S秒,已经下载了T秒,下载速度为每q秒的现实时间能下载下来(q-1)秒 的歌曲.现在开始听歌,如果听到还没下载的地方就从0秒的地方开始replay,求一首歌听完需要从0秒听几次(包括一开始那次) 思路: 我们可以用路程-时间的思路来考虑这道题. 假设两位选手"播放"与"下载","播放"的起点是0m处,"下载"的起点是Tm处,终点在Sm处,"播放"的速度是1m/s,&qu

Codeforces Round #310 (Div. 2)--A(简单题)

http://codeforces.com/problemset/problem/556/A 题意:给一个01字符串,把所有相邻的0和1去掉,问还剩下几个0和1. 题解:统计所有的0有多少个,1有多少个,最后答案就是两者不同的个数. #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algo

Codeforces Round #345 (Div. 2) D 细节题

这个题的意思是给你n张首尾相接的照片, 当前照片在1, 每次只能转移一个单位, 转移时间为a, 照片有可能颠倒, 将照片摆正需要的时间为b, 看照片的时间为1, 想要看尽可能多的照片, 问这个数量是多少, 我们可以预处理查看每张照片需要的时间, 然后枚举从左边看需要的时间, 从右边看需要的时间, 二分从另外一边看需要的时间即可, 代码如下: #include <cstdio> #include <algorithm> #include <cstring> using n

Codeforces Round #316 (Div. 2) (ABC题)

A - Elections 题意: 每一场城市选举的结果,第一关键字是票数(降序),第二关键字是序号(升序),第一位获得胜利: 最后的选举结果,第一关键字是获胜城市数(降序),第二关键字是序号(升序),第一位获得胜利: 求最后选举获胜者. 思路: 直接模拟即可. 代码: /* * @author FreeWifi_novicer * language : C++/C */ #include<cstdio> #include<iostream> #include<cstring

Codeforces Round #491 (Div. 2) — 赛后补题

C. Candies PS:大概是又傻了,读题啊. #include<bits/stdc++.h> #define ll long long #define P pair<int,int> #define pb push_back #define lson root << 1 #define INF (int)2e9 + 7 #define maxn (int)1e5 + 7 #define rson root << 1 | 1 #define LINF (

Codeforces Round #530 (Div. 2)

RANK :2252 题数 :3 补题: D - Sum in the tree 思路:贪心 把权值放在祖先节点上 ,预处理 每个节点保存 他与他儿子中 权值最小值即可. 最后会有一些叶子节点依旧为 INF 权值按0算即可,然后其他的权值计算为 它 - 它父亲的. 注意判断时候会出现父亲比儿子大的这种非法情况. #include<bits/stdc++.h> using namespace std; #define inf 0x7f7f7f7f #define ll long long #de