您的位置:首页 > 其它

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

2015-11-16 11:41 337 查看
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题用这中方法要考虑的比较全面但是也不难想。三题一个小时之内应该要膜出来!唉,再接再厉!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: