Atcoder 水题选做

  为什么是水题选做呢?因为我只会水题啊 (

  为什么是$Atcoder$呢?因为暑假学长来讲课的时候讲了三件事:不要用洛谷不要用dev-c++不要用单步调试。$bzoj$太难了,$Topcoder$整了好久没学会用,中国人要长期打$codeforces$那作息简直反人类,所以就选到$atcoder$啦.而且$AT$的英语感觉比较好懂,或许是因为都是亚洲人,思维比较同步?

  关于水题简单粗暴的定义:$Beginner$ $Contest$的题目。(不过AB题真的有点太水了

  做了两套题后感觉有些$C$的思路还是比较妙的,最好评的是即使是$D$也不会有很高的代码难度。前段时间掉进了大数据结构&&实现麻烦的题目的大坑,现在发现自己的思维好差啊...以后要多做一点思维题.

 

  109 C:https://abc109.contest.atcoder.jp/tasks/abc109_c

  题意概述:给出$n$个城市的坐标以及起始坐标,每次可以移动$d$的距离(或正或负),求最大的$d$使得可以从起点出发经过所有点。

  首先$d$必然是任意点到初始点的距离的因子,否则到不了,然后...答案就是所有点离初始点距离的最大公约数了。(好吧我承认这个$C$是挺水的) 

  
 1 # include <cstdio>
 2 # include <iostream>
 3 
 4 using namespace std;
 5 
 6 int n,x,ans;
 7 int a[100005];
 8 
 9 int gcd (int a,int b)
10 {
11     return b?gcd(b,a%b):a;
12 }
13 
14 int main()
15 {
16     scanf("%d%d",&n,&x);
17     for (int i=1;i<=n;++i)
18     {
19         scanf("%d",&a[i]);
20         a[i]-=x;
21         if(a[i]<0) a[i]=-a[i];
22     }
23     ans=a[1];
24     for (int i=2;i<=n;++i)
25         ans=gcd(ans,a[i]);
26     printf("%d",ans);
27     return 0;
28 }
109 C

  

  109 D:https://abc109.contest.atcoder.jp/tasks/abc109_d

  题意概述:给定一个$H*W$的矩阵,每个格子中有一些硬币,每次可以从一个格子向与他四联通的任意一个格子移动一个硬币(只能移动一次),使得最终的局面中有偶数个硬币的格子最多。

  我感觉这个题挺好的...因为只能移动一次,可以将每个格子的硬币数量$\%2$表示奇偶性,现在问题是怎样移动使得为$0$的格子最多.四联通是一个比较麻烦的东西,因为可能导致处理完的格子再变化.但是可以发现只需要考虑向下和向右移动的情况.偶+偶=偶,奇+奇=偶,偶+奇=奇.从偶数格子里往外移动一定是不合算的,不过两个奇数格子互相传递,中间经过一个偶数格子还是可以的.从一个奇数格子往偶数格子移动一定不会使解更劣:如果后来又将这个多余的硬币移到了奇数格子就可以使解加一,即使不可以,也不过是调换了这两个格子的奇偶性.这是这道题的解法就基本成型了:从上到下遍历棋盘,如果遇到奇数就往右边移动一个,如果已经是最后一列就考虑往下移动,这样构造出来的答案一定是最优的。

  
 1 # include <cstdio>
 2 # include <iostream>
 3  
 4 using namespace std;
 5  
 6 int h,w,f=1,j,x,lasx,lasy;
 7 int g[502][502];
 8 int H,a[250005],b[250005],c[250005],d[250005];
 9  
10 int main()
11 {
12     scanf("%d%d",&h,&w);
13     for (int i=1;i<=h;++i)
14         for (int j=1;j<=w;++j)
15             scanf("%d",&g[i][j]),g[i][j]%=2;
16     for (int i=1;i<=h;++i)
17     {
18         if(i%2) j=1; else j=w;
19         while (1<=j&&j<=w)
20         {
21             if(x)
22             {
23                 a[++H]=lasx,b[H]=lasy,c[H]=i,d[H]=j;
24                 if(g[i][j]) x=0;
25             }
26             else if(g[i][j]) x=1; 
27             lasx=i;
28             lasy=j;
29             j+=f;
30         }
31         f=-f;
32     }
33     printf("%d\n",H);
34     for (int i=1;i<=H;++i)
35         printf("%d %d %d %d\n",a[i],b[i],c[i],d[i]);
36     return 0;
37 }
109 D

  111 C:https://abc111.contest.atcoder.jp/tasks/arc103_a

  2018.10.6一个月没做发现只缺了两场,开心~

  题意概述:给定一个长度为$n$的序列(保证$n$是偶数),可以随意改动序列中的数字,要求改成ABABABAB的形式,($A!=B$),求最少需要改动的次数.

  

猜你喜欢

转载自www.cnblogs.com/shzr/p/9748379.html