基本思想:将记录的存储位置与它的关键字之间建立一个对应关系 常用的方法有:直接定址法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;
}