Codeforces Round #379 (Div. 2) 解题报告

题目地址

本次CF是在今天早上深夜进行,上午有课就没有直接参加。今天早上上课坐到后排参加了virtual participation。这次CF前面的题目都非常的水,不到10分钟就轻松过了前两题,比较郁闷的是之后一直卡在C,开始是脑残的没有用二分TLE,后来又是因为一个常数打错而一直WA……于是模拟赛就只过了2道题(太弱了orz)。时间到了后很快发现了脑残错误,终于A了C题。下午上完课回到宿舍看D题才发现D题水的不行,很快就A了。不过E和F就比较超出我现在知识范围了,暂时就先放下。第一次参加virtual participation,感觉这个模式真的是很赞,以后有时间一定要多多的参加训练自己。道阻且长,加油吧!

A题

这……就数一下A和D的个数,判断一下输出就可以了。没什么可说的。

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 char a[100005];
 5 int n,m=0,k=0,i;
 6 int main()
 7 {
 8     scanf("%d",&n);
 9     scanf("%s",a);
10     for(i=0;i<n;i++)
11     {
12         if(a[i]==‘A‘)
13             m++;
14         else
15             k++;
16     }
17     if(m==k)
18         printf("Friendship\n");
19     else if(m>k)
20         printf("Anton\n");
21     else
22         printf("Danik\n");
23     return 0;
24 }

B题

先尽可能组256,2、5、6个数的最小值即为可组成的256个数。2减去256个数后再取2、3个数最小值即为32个数最大值。这样相加即得到了最多的个数。

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 unsigned long long int a2,a3,a5,a6,he,de;
 5 unsigned long long min3(unsigned long long int x,unsigned long long int y,unsigned long long int z)
 6 {
 7     if(x<y)
 8         return min(x,z);
 9     else
10         return min(y,z);
11 }
12 int main()
13 {
14 cin>>a2>>a3>>a5>>a6;
15     de=min3(a2,a5,a6);
16     a2-=de;a5-=de;
17     a6-=de;
18     he+=de*256;
19     he+=min(a2,a3)*32;
20 cout<<he;
21 }

C题

(TLE、WA了很久,捂脸つ﹏?……)对于第一种魔法就是for循环,逐个判断,其中循环的内部二分查找此时第二种魔法可行中最好的一个。找到对于每一个第一种魔法的第二种魔法最优选法。注意还要看只选第二种魔法的情况。全都比较一下就找到了耗时最短的办法。

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 unsigned long long int n,m,k,a[200002],b[200002],c[200002],d[200002],x,s,i,j,l,r,mid,an;
 5 int main()
 6 {
 7     cin>>n>>m>>k;
 8     cin>>x>>s;
 9     for(i=1;i<=m;i++)
10     cin>>a[i];
11     for(i=1;i<=m;i++)
12     cin>>b[i];
13     for(i=1;i<=k;i++)
14     cin>>c[i];
15     for(i=1;i<=k;i++)
16     cin>>d[i];
17     b[0]=c[0]=d[0]=0;
18     a[0]=x;
19     an=x*n;
20     for(i=0;i<=m;i++)
21     {
22         if(a[i]>x||b[i]>s)
23             continue;
24         l=1;r=k;
25         j=0;
26         while(l<=r)
27         {
28             mid=(l+r)>>1;
29             if(d[mid]+b[i]>s)
30                 r=mid-1;
31         else
32             {
33             l=mid+1;
34             j=max(mid,j);
35             }
36         }
37                 an=min(an,(n-c[j])*a[i]);
38     }
39     cout<<an;
40     return 0;
41 }

D题

用a数组记录8个方向是否可行,b数组记录此时各个方向离目标点最近的点的距离。全都进行过判断后,再遍历一遍a数组看是否有方向满足即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
long long int a[10],b[10],si,sj,ti,tj,n,st,kind,di;
int dir[3][10]={{1,1,1,1,1,1,1,1},{0,1,0,1,0,1,0,1},{1,0,1,0,1,0,1,0}},i;
char c[10];
int val(long int x,long long int y)
{
    long long int d1,d2;
    d1=x-si;
    d2=y-sj;
    if(d2==0&&d1<0)
        return 0;
    else if(d1+d2==0&&d2>0)
        return 1;
    else if(d1==0&&d2>0)
        return 2;
    else if(d1>0&&d1==d2)
        return 3;
    else if(d1>0&&d2==0)
        return 4;
    else if(d1>0&&d1+d2==0)
        return 5;
    else if(d1==0&&d2<0)
        return 6;
    else if(d1<0&&d2==d1)
        return 7;
    else return -1;
}
int main()
{
    memset(b,-1,sizeof(b));
    memset(a,0,sizeof(a));
    scanf("%I64d",&n);
    scanf("%I64d%I64d",&si,&sj);
    while(n--)
    {
        scanf("%s%I64d%I64d",c,&ti,&tj);
        if(c[0]==‘Q‘)
            kind=0;
        else if(c[0]==‘B‘)
            kind=1;
        else kind=2;
        st=val(ti,tj);
        if(st>-1)
        {
            di=max(abs(ti-si),abs(tj-sj));
            if(!dir[kind][st])
                {
                    if(di<b[st]||b[st]<0)
                        {b[st]=di;
                        a[st]=0;
                        }
                    continue;
                }
            else{
            if(di<b[st]||b[st]==-1)
                {
                    a[st]=1;
                    b[st]=di;
                }
            }
        }
        else
        {
            continue;
        }
    }
    for(i=0;i<8;i++)
    {
        if(a[i]==1)
            break;
    }
    if(i<8)
        printf("YES\n");
    else printf("NO\n");
}
时间: 2024-11-10 00:20:17

Codeforces Round #379 (Div. 2) 解题报告的相关文章

Codeforces Round #259 (Div. 2) 解题报告

终于重上DIV1了.... A:在正方形中输出一个菱形 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月01日 星期五 23时27分55秒 4 5 #include<vector> 6 #include<set> 7 #include<deque> 8 #include<stack> 9 #include<bitset> 10 #inclu

Codeforces Round #262 (Div. 2)解题报告

详见:http://robotcator.logdown.com/posts/221514-codeforces-round-262-div-2 1:A. Vasya and Socks   http://codeforces.com/contest/460/problem/A 有n双袜子,每天穿一双然后扔掉,每隔m天买一双新袜子,问最多少天后没有袜子穿.. 简单思维题:以前不注重这方面的训练,结果做了比较久,这种题自己边模拟边想.不过要多考虑trick ```c++ int main(){ i

Codeforces Round #616 (Div. 2)解题报告

Codeforces Round #616 (Div. 2)解题报告 A. Even But Not Even 找两个奇数就行了. #include<bits/stdc++.h> using namespace std; void solve() { int n; string s; cin >> n >> s; string ans = ""; for(int i = 0; i < n; i++) { if(int(s[i] - '0')%2

Codeforces Round #479 (Div. 3)解题报告

题目链接: http://codeforces.com/contest/977 A. Wrong Subtraction 题意 给定一个数x,求n次操作输出.操作规则:10的倍数则除10,否则减1 直接写,手速题,没啥好说的 B. Two-gram 题意 求出现次数最多的连续两个字符 还是签到题,我居然很麻烦地用了map,= =算了,思路畅通都无所谓了 #include <iostream> #include<stdio.h> #include<algorithm> #

Codeforces Round #515 (Div. 3) 解题报告(A~E)

题目链接:http://codeforces.com/contest/1066 A题: 题意:Vova想坐火车从1点到L点,在路上v的整数倍的点上分布着灯笼,而在路上从l到r处停着别的火车,它挡着Vova的视线使他看不到灯笼.给定L,v,l,r求Vova能看到的灯笼数. 分析:从1到x上所有的灯笼数量为x/v个.则路上所有的灯笼数为L/v个,被挡住的则为 r/v - (l-1)/v 个,相减即为答案. #include<iostream> #include<cstdio> #inc

Codeforces Round #401 (Div. 2)解题报告

A - Shell Game 1 #include <iostream> 2 #include<bits/stdc++.h> 3 #include <stack> 4 #include <queue> 5 #include <map> 6 #include <set> 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm> 10

Codeforces Round #390 (Div. 2) 解题报告

时隔一个月重返coding…… 期末复习了一个月也不亏 倒是都过了…… 就是计组61有点亏 复变68也太低了 其他都还好…… 假期做的第一场cf 三道题 还可以…… 最后room第三 standing383简直人生巅峰…… 看楼上楼下都是两道题的 如果A题不错那么多估计能进前300了吧…… 这场倒是把之前两场的分加回来了 开头不错 这个假期争取紫名~ A.Lesha and array splitting 把给定的数组分割成几个区间 要求各个区间和不能为0 一开始没注意到分割之后的区间重新合成之

Codeforces Round #394 (Div. 2) 解题报告

开始补题,今天下午virtual参赛,过了ABC,D题因为一点小错误而没能在比赛时间中AC,时间到了之后几分钟就发现了问题所在,略有遗憾.之后一直冥思苦想E题,在提示下终于明白,真的是给这样组合题画风的题目跪了,只能说继续加油,扩展思路吧. A题 题目地址 只有奇偶数个数相差小于等于1时可以,需要特判不能使二者均为0的情况. 参考代码 1 #include<stdio.h> 2 #include<bits/stdc++.h> 3 #include <iostream>

Codeforces Round #279 (Div. 2) 解题报告

A - Team Olympiad 贪心水题..都从第一个开始取即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map