现在的位置: 首页 > 综合 > 正文

20130805-codeforce 108-div2-CF训练

2013年04月22日 ⁄ 综合 ⁄ 共 2180字 ⁄ 字号 评论关闭

今天的题目总的来说不难,就是想法的问题,自己各种傻逼啊。

A. Marks

这道题目就是就是,自己煞笔了,当时思维太乱了,总想着每一个人的每一科目都和其他人的比,逻辑太乱。就是让

你判断每一个人是不是拥有至少每一科目当中的最高分。每一次统计一次最高分,再拿给每一个人判断,是的话就标

记一下。擦,自己太SB了:

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
char sp[105][105];
int vis[105];
int main()
{
    int n,m;
    cin >> n >>m;
    memset(vis,0,sizeof(vis));
    for(int i = 1; i<=n; i++)
        for(int j=1; j<=m; j++)
            cin >> sp[i][j];
    int num;
    for(int i = 1; i <= m; i++)
    {
        num = 0;
        for(int j = 1; j<=n; j++)
            if((sp[j][i]-'0') >= num)
                num =(sp[j][i]-'0');
        for(int j =  1; j <= n; j++)
            if((sp[j][i]-'0') >= num)
                vis[j]=1;
    }
    int s=0;
    for(int i=1; i<=n; i++)
        if(vis[i])
            s++;
    cout << s <<endl;
    return 0;
}

B. Steps

这道题目就是一个向量,给你开始的位置,选择一个方向后,沿着这个方向一直走到不能走为止,在选择下一个向量

。移动步数可以为0。问最多可以移动多少步?

直接选择一个方向,判断一下是不是x,y同时移动,是的话就直接取最小值移动。当然,考虑一下x和y的正负问题。

向上就移动到n和m,向下就移动到1.过掉所有的向量就可以了。

自己想直接选一个一次一个向量的向前移动,毫不犹豫的T了。太水了:

#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;

#define NP 1000000001
#define N 10004
int n, m, k;
int dirx[N], diry[N];
int x, y;
int main()
{
    cin >> n >> m;
    cin >> x >> y;
    cin >> k;
    for(int i = 0; i < k; ++i)
        scanf("%d%d", &dirx[i],&diry[i]);
    __int64 cnt = 0;
    int dx,dy;
    for(int i = 0; i < k; ++i)
    {
        if(dirx[i] < 0)//判正负
            dx = x - 1;
        if(dirx[i] > 0)
            dx = n - x;
        if(diry[i] < 0)
            dy = y - 1;
        if(diry[i] > 0)
            dy = m - y;
        int mx = -1;
        int my = -1;
        if(dirx[i] != 0)
            mx = abs(dx / dirx[i]);
        if(diry[i] != 0)
            my = abs(dy / diry[i]);
        if(mx == -1)//但Y移动
        {
            cnt += my;
            y += my * diry[i];
        }
        else if(my == -1)//单X移动
        {
            cnt += mx;
            x += mx * dirx[i];
        }
        else//同时移动取最小
        {
            int tp = min(mx, my);
            cnt += t;
            x += t * dirx[i];
            y += t * diry[i];
        }
    }
    printf("%I64d\n", cnt);
    return 0;
}

C. Pocket Book

排列组合问题,每一位可以有多少种选择。各位相乘就可以了。找出可以组出的不同字符串:


#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;
#define N 1000000007
int n, m;
char sp[111][111];
int vis[100];
int main()
{
    cin >> n >> m;
    __int64 sum = 1;
    for(int i=0; i<n; i++)
        scanf("%s", sp[i]);
    for(int j = 0; j < m; j ++)
    {
        memset(vis, 0,sizeof(vis));
        int cnt = 0;
        for(int i = 0; i < n; i++)
        {
            if(vis[sp[i][j] - 'A'] == 0)
            {
                cnt ++;
                vis[sp[i][j] - 'A'] = 1;
            }
        }
        //cout << cnt <<endl;
        sum = sum * cnt % N;
    }
    cout << sum << endl;
    return 0;
}

自己太水了.....

抱歉!评论已关闭.