Codeforces Round #674 (Div. 3) ABCDE

学长给的翻译就是好哇!!!通俗易懂!!!嘻嘻嘻懒得自己翻了。

A .Floor Number

题目大意:今天是yyj要去约会的日子,为了显示出他的帅气,他决定穿着编号为n的衣服出门,可是他忘了自己的衣服放在哪里了,yyj家是一栋可以无限增长的高楼,每层都有他的衣柜,除了第一层有两个衣柜,其他每层均有x个衣柜,且衣柜的编号依次递增,yyj的每一件衣服都是独特的,所以他的每一个衣柜中只会放一件衣服,请你帮助yyj找到他的衣服在哪一层

输入的第一行包含一个整数t(1≤t≤1000)——测试用例的数量。

然后是t行测试用例。 每行包含两个整数n和x(1≤n,x≤1000)--yyj要去取的n号衣服和除第一层以外的每层的衣柜数(一层只有两个衣柜)。

输出yyj要前往的层数

input

4

7 3

1 5

22 5

987 13

output

3

1

5

77

note:在第一个测试样例中,yyj要取3号衣服,一层有两个衣柜,编号为1、2,其余层都有9个衣柜,所以二层衣柜编号为3到11,所以yyj要去第二层拿衣服。

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int n,x;
        cin>>n>>x;
        if(n<=2) cout<<"1"<<endl;
        else
        {
            int sum=(n-2)/x;
            if((n-2)%x!=0) sum++;
            cout<<sum+1<<endl;
        }
    }
    return 0;
}

B.Symmetric Matrix

题目大意:PP有n种中不同样式的方块,但是每种方块的数量都有无限的。方块长为2,宽也是2,因此一个方块中可以包含有4个数字(四个数字分别位于方块的左上方,右上方,左下方,右下方)。

PP现在想用这些方块拼成一个长为m,宽为m的大方块(即大方块中包含m*m个数字,我们可以将这样的大方块看作一个大矩阵)。PP热爱一切拥有对称美的事物,他想让拼成的大方块所构成的矩阵是对称矩阵。请你帮他确认他是否可以做到呢?

(注:对称矩阵是矩阵所有元素以主对角线为对称轴对应相等)

测试用例的第一行包含两个整数n和m(1≤n≤100,1≤m≤100)——方块类型的数量n和PP想要拼的大方块的大小m。

接下来的2n行描述n种不同的方块。方块的类型一个接一个地写,每一个类型都写在两行上。

请注意禁止对所给的方块进行旋转,只允许将其放置在输入中的方向。

对于每个测试:如果PP可以构造大小为m×m的方块,且是一个对称矩阵,则输出“YES”。否则,输出“NO”。

Input

6
3 4
1 2
5 6
5 7
7 4
8 9
9 8
2 5
1 1
1 1
2 2
2 2
1 100
10 10
10 10
1 2
4 5
8 4
2 2
1 1
1 1
1 2
3 4
1 2
1 1
1 1

Output

YES
NO
YES
NO
YES
YES
(input这一串太长了!周测的时候眼睛长歪了看走眼了,给数据画线的时候画歪了。。。白wa了两次)
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        int a,b,c,d,flag=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a>>b;
            cin>>c>>d;
            if(b==c) flag=2;
        }
        if(m%2==1) cout<<"NO"<<endl;
        else if(flag==2) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

C.Increase and Copy

题目大意:刚开始给你一个数组为[1],。你每次可以有如下两种操作:
(1) 从数组中选择任意一个数字,并分裂成两个一模一样的数。
(2) 从数组中选择一个数加1。
例如,现在你有五次操作的机会。
第一次,把第一个数分裂,变成[1,1]。
第二次,把第一数加1操作,[2,1]。
第三次,把第二个数分裂,[2,1,1]。
第四次,把第一个数分裂,[2,1,1,2]。
第五次,把第四个数加1,[2,1,1,3]。
五次后数组元素总和为2+1+1+3 = 7.
你的任务是消耗最少的次数使得数组的总和大于等于n。

输入的第一行包含一个整数t(1≤t≤1000)--测试用例的数量。然后,t个测试用例随之而来。
测试用例的唯一一行包含一个整数n(1≤n≤1000000000)--总和。

对于每个测试用例,打印答案:获得数组总和至少为n的最少操作次数。

Input

4
1
5
42
1000000000

Output

0
3
11
63244
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int a;
        cin>>a;
        if(a==1) cout<<"0"<<endl;
        else if(a==2) cout<<"1"<<endl;
        else if(a==3||a==4) cout<<"2"<<endl;
        else if(a==5||a==6) cout<<"3"<<endl;
        else if(a==7||a==8||a==9) cout<<"4"<<endl;
        else
        {
            /*if(a%2==1) a++;
            int sum=a;
            for(int i=2;i<=(int)sqrt(a);i++)
            {
                if(a%i==0)
                {
                    int j=a/i;
                    sum=min(sum,j+(i-2));
                }
            }
            cout<<sum<<endl;*/
            int b=sqrt(a);
            int c=a/b; //cout<<b<<" "<<c<<endl;
            int sum=(b-1)+(c-1);
            if(a!=b*c) sum++;
            cout<<sum<<endl;
        }
    }
    return 0;
}

代码繁琐了些,因为第一思路歪了点(捂脸),第二思路掰回来了就欧克了。

D.Non-zero Segments

鲜花学长喜欢1,因为他平时收到消息时会回复别人1,所以他非常不喜欢0,他的目标是消灭数组中所有的0, 有一个数组a,其中不存在a_i=0,但是丧心病狂的它觉得这还不能够满足 即使是这个数组的任意子段(subsegment)的和为0也是它不能接受的。 他可以往数组中的任意位置插入任意大小的数(注意是任意大小,包括无穷大),请问最少插入几个数后才能成为鲜花学长的理想数组(即不存在子段和为0的情况)

第一行为数组元素个数n∈[2,200 000] 第二行为n个元素a_i∈[-10^9,10^9],a_i≠0

输出需要最少插入数字的个数

Input

4
1 -5 3 2

Output

1

Input

5
4 -2 3 -9 2

Output

0

Input

9
-1 1 -1 1 -1 1 1 -1 -1

Output

6

Input

8
16 -5 -11 -15 10 5 4 -4

Output

3

思路:用map存储出现的sum次数,遇到重复的时候即前缀中有为0的时候,time++,重新初始化,以此类推。

 

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    int a[200200],time=0;
    long long int sum=0;
    map<long long int,int> mp;
    mp[0]=1;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum+=a[i];
        if(mp[sum]!=0)
        {
            time++;
            mp.clear();//清空后再加入初始化和第一步
            mp[0]=1;
            sum=a[i];
        }
        mp[sum]++;
    }
    cout<<time<<endl;
    return 0;
}

E.Rock, Paper, Scissors

题意:
alice和bob玩剪刀石头布, 他们玩的次数n次,已知alice出了a1个石头、a2个剪刀、a3个布,bob出了b1个石头、b2个剪刀、b3个布,现在你可以调整他们的出拳顺序,问alice最少赢了多少次,最多赢了多少次。 其中 a1+a2+a3=b1+b2+b3=n ( 1<=n<=10^9)

Input

2
0 1 1
1 1 0

Output

0 1

Input

15
5 5 5
5 5 5

Output

0 15

Input

3
0 0 3
3 0 0

Output

3 3

Input

686
479 178 29
11 145 530

Output

22 334

Input

319
10 53 256
182 103 34

Output

119 226

(问Alice最少赢了几次,最多赢了几次?)

max=min(a1,b2)+min(a2,b3)+min(a3,b1);

min的思考方式:

alice的石头跟bob的石头+布抵消; 剪刀跟石头+剪刀抵消; 布跟剪刀+布抵消。

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    int a1,a2,a3,b1,b2,b3;
    cin>>a1>>a2>>a3;
    cin>>b1>>b2>>b3;
    int minn=0,maxn=0;
    if(a1-b1-b3>=0) minn+=a1-b1-b3;
    if(a2-b1-b2>=0) minn+=a2-b1-b2;
    if(a3-b2-b3>=0) minn+=a3-b2-b3;
    maxn=min(a1,b2)+min(a2,b3)+min(a3,b1);
    cout<<minn<<" "<<maxn<<endl;
    return 0;
}

据苏佬说f跟省赛a题很像。。。算了先吃饭,dp令人害怕。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vijurria

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值