当前位置:编程学习 > C/C++ >>

codeforce 192 div2解题报告

今天大家一起做的div2,怎么说呢,前三题有点坑,好多特判....

A. Cakeminator


题目的意思是说,让你吃掉cake,并且是一行或者一列下去,但是必须没有草莓的存在。这道题目,就是判断一下每行和每列的情况,看是不是有草莓存在,有的话就标记一下。后面就直接把木有草莓的行和列求和再减去重复路过的cake就行,不过你第一遍写的比较麻烦,小数据过了,后来WA了,现在改了一种写法。就是简单的加加减减。上代码:


[cpp]
<SPAN style="FONT-FAMILY: KaiTi_GB2312; FONT-SIZE: 18px">#include <iostream> 
#include <cstdio>  
#include <string>  
#include <string.h>  
#include <map>  
#include <vector>  
#include <cstdlib>  
#include <algorithm>  
#include <cmath>  
#include <queue>  
#include <set>  
#include <stack>  
using namespace std; 
int n, m; 
char sp[200][200]; 
int x[200]; 
int y[200]; 
int main() 

    scanf("%d%d", &n, &m); 
    for(int i = 0; i< n; ++i) 
        scanf("%s", sp[i]); 
    memset(x, 0, sizeof(x)); 
    memset(y, 0, sizeof(y)); 
    int sumxs = 0, sumys = 0; 
    for(int i = 0; i < n; ++i) 
    { 
        for(int j = 0; j < m; ++j) 
        { 
            if(sp[i][j] == 'S') 
            { 
                x[i] = 1; 
                sumxs++; 
                break; 
            } 
        } 
    } 
    for(int i = 0; i < m; ++i) 
        for(int j = 0; j <n; ++j) 
        { 
            if(sp[j][i] == 'S') 
            { 
                y[j] =1; 
                sumys++; 
                break; 
            } 
        } 
    //cout << sumxs << ' ' << sumys <<endl;  
    int cnt = 0; 
    cnt += (n-sumxs)*m; 
    cnt += (m-sumys)*n; 
    //cout << cnt <<endl;  
    cnt -= ((n-sumxs)*(m-sumys)); 
    cout << cnt <<endl; 
    return 0; 
}</SPAN> 

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
using namespace std;
int n, m;
char sp[200][200];
int x[200];
int y[200];
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 0; i< n; ++i)
        scanf("%s", sp[i]);
    memset(x, 0, sizeof(x));
    memset(y, 0, sizeof(y));
    int sumxs = 0, sumys = 0;
    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < m; ++j)
        {
            if(sp[i][j] == 'S')
            {
                x[i] = 1;
                sumxs++;
                break;
            }
        }
    }
    for(int i = 0; i < m; ++i)
        for(int j = 0; j <n; ++j)
        {
            if(sp[j][i] == 'S')
            {
                y[j] =1;
                sumys++;
                break;
            }
        }
    //cout << sumxs << ' ' << sumys <<endl;
    int cnt = 0;
    cnt += (n-sumxs)*m;
    cnt += (m-sumys)*n;
    //cout << cnt <<endl;
    cnt -= ((n-sumxs)*(m-sumys));
    cout << cnt <<endl;
    return 0;
}
B. Road Construction


题目的意思是说现在给你n个点,然后在给你m个关系,这m个个关系表示某两条边之间不能连边,问你求最短的建筑方案是什么,要求任意两点之间距离不能超过2.

这道题目当时纠结了很久,不知道怎么去链接,后面才想到这只能是所有的点围在一个点的周围的情况。其它的总会有两点之间的距离超过2的。所以就简单了,直接找到可以和任何一个点相连的点,输出他和剩下的点的序列就行了 。


[cpp]
<SPAN style="FONT-FAMILY: KaiTi_GB2312; FONT-SIZE: 18px">#include <iostream> 
#include <cstdio>  
#include <string>  
#include <string.h>  
#include <map>  
#include <vector>  
#include <cstdlib>  
#include <algorithm>  
#include <cmath>  
#include <queue>  
#include <set>  
#include <stack>  
using namespace std; 
char sp[200][200]; 
int main() 

    int n; 
    scanf("%d", &n); 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,