Codeforces Round #364 (Div. 2)

时间:2021-12-16 00:09:30

这场是午夜场,发现学长们都睡了,改主意不打了,第二天起来打的virtual contest。

A题 http://codeforces.com/problemset/problem/701/A

巨水无比,好像三四分钟就直接A了。。。直接n²暴力。

 #include <cstdio>
 #include <map>
 #include <queue>
 #include <cstring>
 #include <algorithm>
 #include <iostream>
 using namespace std;
 #define mem0(x) memset(x,0,sizeof(x))
 #define mem1(x) memset(x,-1,sizeof(x))
 typedef long long LL;
 const int INF = 0x3f3f3f3f;

 ],vis[];
 int main()
 {
     ;
     scanf("%d",&n);
     ;i<=n;i++)
         scanf("%d",&a[i]),tot += a[i];
      / n;
     mem0(vis);
     ;i<=n;i++)
     {
         ) continue;
         vis[i] = ;
         ;j<=n;j++)
         {
              && a[i] + a[j] == need)
             {
                 printf("%d %d\n",i,j);
                 vis[j] = ;
                 break;
             }
         }
     }
     ;
 }

B题  http://codeforces.com/problemset/problem/701/B

其实挺简单的,就是一开始想错了,像不像八皇后!搞得我想错了= =。

其实是一道数学题,直接V数组和C数组记录一下行和列,推个公式直接AC。

如果说要注意什么地方的话,应该是这几个longlong.

long long tot = (LL)n * n -(LL)(rec_c + rec_r) * n + (LL)(rec_c) * rec_r;

还有一个技巧!输出答案的技巧,可以简化你的代码量,程序员总是懒的,能省一点是一点。

;i<m;i++)
{
         printf()?'\n':' ');
}
 #include <cstdio>
 #include <map>
 #include <queue>
 #include <cstring>
 #include <algorithm>
 #include <iostream>
 using namespace std;
 #define mem0(x) memset(x,0,sizeof(x))
 #define mem1(x) memset(x,-1,sizeof(x))
 typedef long long LL;
 const int INF = 0x3f3f3f3f;
 +;
 int r[maxn],c[maxn];
 LL ans[maxn];
 int main()
 {
     int n,m,x,y;
     scanf("%d%d",&n,&m);
     , rec_c = ;
     ;i<m;i++)
     {
         scanf("%d%d",&x,&y);
         )
             rec_r++;
         )
             rec_c++;
         r[x] = ;
         c[y] = ;
         long long tot = (LL)n * n -(LL)(rec_c + rec_r) * n + (LL)(rec_c) * rec_r;
         ans[i] = tot;
     }
     ;i<m;i++)
     {
         printf()?'\n':' ');
     }
     ;
 }

C题!尺取法!一个技巧!知道这个方法的话,这道题就是模板题了,233333.在那个《挑战程序设计竞赛》这本书3.2里头。

 #include <cstdio>
 #include <set>
 #include <map>
 #include <algorithm>
 #include <iostream>
 using namespace std;
 +];
 int main()
 {
     int p;
     scanf("%d",&p);

     set<char>all;

     getchar();
     ;i<p;i++)
         scanf("%c",&a[i]),all.insert(a[i]);

     int n = all.size();

     , t = , num =;
     map<int, int>cnt;
     int res = p;
     for(;;)
     {
         while(t<p&&num<n)
         {
             )
                 num++;
         }
         if(num < n) break;
         res  = min(res, t - s);
         )
             num--;
     }
     printf("%d\n",res);
     ;
 }

D题http://codeforces.com/contest/701/problem/D

题目大意:距离为l,有n个人,人行走速度为v1,有一辆限载k人的车,车速为v2,问最短到达目的地时间。(每个人只能乘车一次)

关键点:若要时间最短,便要每个人乘车时间相同。

然后推公式就行了。

t1是行走时间,t2是乘车时间。t3是汽车空车返回的时间。

有一个重要的等式是:一个人行走的时间不仅是t1,也可以是(m-1)*(t2 + t3)。t3=t2*(v2-v1)/(v2+v1)

 #include <cstdio>
 #include <iostream>
 using namespace std;

 int main()
 {
     double n, l, v1, v2, k, t1, t2, t;
     scanf("%lf%lf%lf%lf%lf", &n, &l, &v1, &v2, &k);
     ) / k;
     t2 = l / (v2 + v1 * (m - ) * ( * v2) / (v1 + v2));
     t = t2 + (l - t2 * v2) / v1;
     printf("%.10lf\n", t);
     ;
 }