哈希思想

基本思想:将记录的存储位置与它的关键字之间建立一个对应关系  常用的方法有:直接定址法hash(key)=key或hash(key)=a*key+b        取余法hash(key)=key%p  

 题意: 给一系列矩形的右上角坐标和左下角坐标,如:(5,8,7,10)表示(5,8),(7,8),(7,10),(5,10)组成的矩形,求这一系列矩形覆盖的1*1的方格的数量,重复覆盖只计数一次。(-1,-1,,1,,1)用来分割没一组矩形,(-2,-2,-2,,2)用来表示程序输入结束。 
题解: 给出的四个数代表以(5,8)(7,10)为对角线的矩形,用二维数组模拟平面,遍历每个矩形,标记每个矩形覆盖的1*1的方格。找规律发现把右界限和上界限缩小1以后所标记的点数就是所在的方格数

#include <iostream>
using namespace std;
int main()
{
    int k[101][101];
    int a,b,c,d,i,j,sum;
    while(1)
    {
        sum=0;
        for(i=0; i<101; i++)
            for(j=0; j<101; j++)
                k[i][j]=0;
        while(1)
        {
            cin>>a>>b>>c>>d;
            if(a==-1&&b==-1&&c==-1&&d==-1)
                break;
            if(a==-2&&b==-2&&c==-2&&d==-2)
                break;
                if(a>c)
                    swap(a,c);
                if(b>d)
                    swap(b,d);
            for(i=a; i<c; i++)
                for(j=b; j<d; j++)
                    k[i][j]++;
        }

        for(i=0; i<101; i++)
            for(j=0; j<101; j++)
                if(k[i][j]!=0)
                    sum++;
                    cout<<sum<<endl;
                if(a==-2&&b==-2&&c==-2&&d==-2)
                break;
    }

    return 0;
}

Description

n个人想玩残酷的死亡游戏,游戏规则如下: 

n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。 

请输出最后一个人的编号。

Input

输入n和m值。

Output

输出胜利者的编号。

Sample Input

5 3

Sample Output

4

emmmmm听说有简单公式 但是小菜狗子推不出来 只能写出基本思路然后 边wrong边修改 终于a了 活着的人标记为1 死去的人修改为0 直到d=0表示产生胜利者    此处ge开t同步 可以使得cin cout 和 scanf printf 的速度差不多  

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int  f[3000001];

int main()
{
    int n,m,i,k=1,d;
    ios::sync_with_stdio(true);
    scanf("%d %d",&n,&m);
    d=n;
    f[0]=0;
    for(i=1; i<=n; i++)
        f[i]=1;
    for(i=1; ;)
    {

       if(f[i]==0)
        {
            i++;
             if(i>n)
                i=1;
            continue;
        }
        else if(k!=m)
        {
             k++;
             i++;
             if(i>n)
                i=1;
             continue;
        }

      if(k==m)
        {
            f[i]=0;
            k=1;
            d--;

        }
       if(d==0)
            break;
    }
    printf("%d",i);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值