Codeforces 596A B C Codeforces Round #331 A B C

A.水。读题目要快而准确

<span style="font-size:14px;">#include <iostream>
#include <cmath>
#include <stdio.h>
using namespace std;

int main()
{
    int n,a[4],b[4];
    long long s;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a[i],&b[i]);
        }
        if(n==1)
        {
            printf("-1\n");
            continue;
        }
        if(n==2)
        {
            if(a[1]==a[0] || b[0]==b[1])
                s=-1;
            else
                s=(long long )abs(b[1]-b[0])*abs(a[1]-a[0]);
        }
        else if(n==3 || n==4 )
        {
            for(int i=0;i<n-1;i++)
            {
                for(int j=i+1;j<n;j++)
                {
                    if(a[i]!=a[j] && b[i]!=b[j])
                        s=(long long )abs(b[i]-b[j])*abs(a[i]-a[j]);
                }
            }
        }
        printf("%I64d\n",s);
    }
    return 0;
}</span><span style="font-size:18px;">
</span>

B 。不难想,不过比A题好一点,代码很短。

<span style="font-size:14px;">#include <iostream>
#include <stdio.h>
#include <cmath>
#include <string.h>
using namespace std;
long long a[200005],b[200005];
int main()
{
    int n;
    long long sum,node,cnt;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            scanf("%I64d",&b[i]);
        memset(a,0,sizeof(a));
        sum=cnt=0;
        for(int i=0;i<n;i++)
        {
            node=b[i]-(a[i]+sum);
            cnt+=abs(node);
            sum+=node;
        }
        printf("%I64d\n",cnt);
    }

    return 0;
}</span><span style="font-size:18px;">
</span>
C:一开始并没有膜出来,今天早上看了大牛的代码,完全看不懂,都用了pair。对我有用的是数据。看了一直WA的test4的数据,终于找到了自己的错误,在对W排序的时候,如果wi==wj应该w.id小的排在前面。改完就过了。

详细注释代码:

<span style="font-size:14px;">#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <cmath>
using namespace std;
struct node1
{
    int x,y,v;
}t[100005],a[100005];
struct node2
{
    int w,id;
}p[100005];
bool cmp1(node1 n1,node1 n2)
{
    return n1.v<n2.v || n1.v==n2.v && n1.y<n2.y || n1.v==n2.v && n1.y==n2.y && n1.x<n1.x;  //对点排序
}
bool cmp2(node2 n1,node2 n2)
{
    return n1.w<n2.w || n1.w==n2.w && n1.id<n2.id;   //对W排序
}
int main()
{
    int n;
    while( cin>>n){
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&t[i].x,&t[i].y);
            t[i].v=t[i].y-t[i].x;
        }
        for(int i=0;i<n;i++)
        {
            scanf("%d",&p[i].w);
            p[i].id=i;     //记录Wi的位置
        }
        sort(t,t+n,cmp1);
        sort(p,p+n,cmp2);
        int flag=0;
        for(int i=0;i<n;i++)    //在这两个排序之后,如果是YES,t[i].v和p[i].w 是一一对应的,否则NO
        {
            if(t[i].v!=p[i].w)
            {
                flag=1;
                break;
            }
        }
        if(flag)
        {
            printf("NO\n");
            return 0;     
        }
        for(int i=0;i<n;i++)
        {
            a[p[i].id].x=t[i].x;   //因为是YES了,所以一定是一一对应的,W数组元素的顺序就是最后答案的顺序,
            a[p[i].id].y=t[i].y;       //所以用一个新的数组记录这个最后答案的顺序
        }
        for(int k=0;k<n-1;k++)  //数组a现在已经是正确的顺序了,那么就是要判断一下这个顺序是否满足“优美顺序”
        {
            if((a[k+1].x<=a[k].x && a[k+1].y<=a[k].y))  //判断是否是“优美顺序”,到底是不是这样,实际上我也不知道证明这样可以,但是举不出反例
            {
                flag=1;
                break;
            }
        }
        if(flag)
            printf("NO\n");
        else
        {
            printf("YES\n");
            for(int i=0;i<n;i++)
                printf("%d %d\n",a[i].x,a[i].y);
        }
    }
    return 0;
}</span><span style="font-size:18px;">
</span>


总结:A题都WA了两次,B题代码交错了一次,C题最后20分钟才开始敲代码,期间思路虽然正确过但是没有把握。A,B两题加起来再多也不能超过15分钟过的,而我却花了50分钟,照现在这样,打铁一辈子的命。C题用这中方法要考虑的比较全面但是也不难想。三题一个小时之内应该要膜出来!唉,再接再厉!



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值