Codeforces Round #341 (Div. 2)

最近状态都不好,做题都想半天

A. Wet Shark and Odd and Even

题意:给你n个数,求n个数最大和且要被2整除

思路:偶数+偶数=偶数   奇数+奇数=偶数  奇数+偶数=奇数,所以只要是偶数就加上,奇数的话先存到数组里面去,然后对奇数数组排序,偶数个就全部加上,奇数个的话就去掉第一项,剩下的就全部加上


 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int qq=1e5+10;
 5 long long a[qq],b[qq];
 6 int main()
 7 {
 8     long long n,i,j,k,x,sum;
 9     scanf("%lld",&n);
10     i=j=sum=0;
11     for(k=0;k<n;++k){
12         scanf("%lld",&x);
13         if(x%2==0)    sum+=x;
14         else        b[i++]=x;  
15     }
16     sort(b,b+i);
17     if(i==1||i==0){
18         printf("%lld
",sum);
19     }
20     else{
21         if(i%2==0){
22             for(k=0;k<i;++k)
23                 sum+=b[k];
24             printf("%lld
",sum);
25         }
26         else{
27             for(k=1;k<i;++k)
28                 sum+=b[k];
29             printf("%lld
",sum);
30         }
31     }
32 }



B. Wet Shark and Bishops

题意:有一个1000*1000的网格,给出n个象的点,对角线上象之间两两都可以攻击,问一共有多少攻击组合

思路:只要是对角线就满足x+y=k(k=0,1,2....)或者x-y=k(k=0,1,2....))  所以只要统计出每一组对角线上有多少个点然后套公式就可以出来了

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 const int qq=2000+50;
 5 int a[qq],b[qq];
 6 int main()
 7 {
 8     int n;scanf("%d",&n);
 9     memset(a,0,sizeof(a));
10     memset(b,0,sizeof(b));
11     for(int i=0;i<n;++i){
12         int x,y;
13         scanf("%d%d",&x,&y);
14         a[x+y-1]++;            //统计自左向右的对角线上点的个数 
15         b[x-y+1000]++;        //统计左右向左的对角线上点的个数 
16     }
17     long long sum=0;
18     for(int i=1;i<=2000;++i){
19         long long ans=a[i];
20         sum+=(ans-1)*ans/2;
21         ans=b[i];
22         sum+=(ans-1)*ans/2;
23     } 
24     printf("%lld
",sum);
25     return 0;
26 }

最近状态确实不行,也可能是比赛打少了吧,而且最近心态也不怎么好,以后争取每几天打一场CF,补一补以前没打过的场,加油!!!

把状态调换过来、保证自己的学习效率、       

不负未来、

原文地址:https://www.cnblogs.com/sasuke-/p/5174277.html