c语言,如何从确定的二位数组中任取其中2元素,才能不重不漏得把所有情况取到?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言,如何从确定的二位数组中任取其中2元素,才能不重不漏得把所有情况取到?相关的知识,希望对你有一定的参考价值。

不知道问题是不是复杂,很麻烦答得好有加分。
分不是问题~!

#include<stdio.h>
#include<stdlib.h>
#include <time.h>

#define M 4
#define N 6
void RandNum(int p[M][N],int q[M][N],int *r,int *c)
int x,y;
while(1)
x=rand()%M; /*随机选择行 */
y=rand()%N; /*随机选择列 */
if(q[x][y]==0)break; /* 该位置未被选择过 */

q[x][y]=-1; /* 设标志 */
*r=x;*c=y; /* 选择的是x行,y列 */


main()

int a[M][N];
int b[M][N]=0; /*标志数组,初始时全为0 */
int ,i,j,row,col;
srand((unsigned)time( NULL));
/*准备数据*/
for(i=0;i<M;i++)
for(j=0;j<N;j++)a[i][j]=rand()%(M*N)+1;

printf("Row1\tCol1\tVal1\tRow2\tcol2\tVal2\n");
for(i=0;i<M*N/2;i++) /*每次随机选取两个数据 */
RandNum(a,b,&row,&col);
printf("%d\t%d\t%d\t",row,col,a[row][col]);
RandNum(a,b,&row,&col);
printf("%d\t%d\t%d\n",row,col,a[row][col]);

参考技术A 试一下用构造哈希函数,查找时每次取两个数。。。

9.13模拟赛

全排列

(permutation.cpp/c/pas)
Description
从 n 个不同元素中任取 m(m≤n)个元素,按照一定的顺序排列起来,叫做从 n
个不同元素中取出 m 个元素的一个排列。当 m=n 时所有的排列情况叫全排列。
你觉得 xxy 会问你全排列的个数吗?Xxy:这个问题能淹死你,我才不问呢。我
要问的是求 n 的全排列中,先递增后递
减、先递减后递增的全排列的个数。由于答案可能很大,对 p 取余
Input
输入包含多组测试数据每组测试
数据一行两个整数 n,p
Output
对于每组测试数据输出一行表示答案
Example
permutation.in permutation.out
3 5 4
2 233 0
Hint
设数据组数为 T
对于 10%的数据,n<=10,p<=1000,T=1
对于另外 10%的数据,n<=12,p<=1000,T<=12
对于另外 10%的数据,n<=100,p<=100000,T<=100
对于另外 10%的数据,n<=100000,p<=1000000,T=1
对于另外 10%的数据,n<=100000,p<=1000000,T<=1000
对于另外 20%的数据,n<=1e9,p<=1e9,T<=1000
对于 100%的数据,n<=1e18,p<=1e18,T<=1000

题解:打表找规律+快速幂+快速乘

规律可得

n=3,ans=4.

n=4,ans=12

n=5,ans=28

所以ans=2^n-4.

代码

 

#include<iostream>
#include<cstdio>
using namespace std;
long long n,p;
long long mul(long long x,long long y){
    long long ans=0,now=x;
    while(y){
        if(y&1){
            ans=(ans+now)%p;
        }
        now=(now+now)%p;
        y>>=1;
    }
    return ans;
}
long long pow(long long x,long long y){
    long long now=x,ans=1;
    while(y){
        if(y&1)ans=mul(ans,now),ans%=p;
        now=now*now%p;
        y>>=1;
    }
    return ans;
}
int main(){
    while(cin>>n>>p){
        if(n==1||n==2){
            printf("0\n");
            continue;
        }
        cout<<(pow(2,n)-4+p)%p;
    }
    return 0;
}

 

埃及分数

(egypt.cpp/c/pas)
Description
对于一个分数 a/b(a!=1),将它表示为 1/x + 1/y + 1/z ……的形式,x,
y,z……互不相同。
多解取加数少的。加数相同时,取最小的分数最大的,最小分数相同时,取次小分
数最大的,以此类推。
输入保证 a<b 且 gcd(a,b)=1
Input
输入包含多组测试数据每组测试数
据包含一行 2 个数 a,b
Output
对于每组测试数据,输出一行表示答案,只输出分母,每个分母之间空 1 格
从小到大输出
Example
egypt.in egypt.out
5 6 2 3
8 9 2 3 18
Hint
对于 10%的数据,a,b<=10
对于另外 10%的数据,a,b<=100
对于另外 20%的数据,a,b<=10000
对于另外 30%的数据,a,b<=100000
对于 100%的数据,a,b<=1000000
由于本题时间复杂度不随数据范围的递增而递增,在此给出 std 耗时:
30% <=0.01s
10% <=0.2s
40% <=0.5s
20% <=0.9s

题目大意:迭代加深搜索

代码:

int main(){
    int a,b;
    int rnd=0;
    while(~scanf("%d%d",&a,&b)){
        int ok=0;
        for(maxd=1;;maxd++){
            memset(ans,-1,sizeof(ans));
            if(dfs(0,get_first(a,b),a,b)){
                ok=1;break;
            }
        }
    }
    return 0;
}
int get_first(int x,int y){
    int res=y/x;
    return res*x>=y?:res:res+1;
}
ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}
bool better(int d){
    for(int i=d;i>=0;i--)
     if(v[i]!=ans[i])
      return ans[i]==-1||v[i]<ans[i];
    return false;
}
bool dfs(int d,int from,ll aa,ll bb){
    if(d==maxd){
        if(bb%aa)return false;
        v[d]=bb/aa;
        if(better(d))memcpy(ans,v,sizeof (ll)*(d+1));
        return true;
    }
    bool ok=true;
    from=max(from,get_first(aa,bb));
    for(int i=from;;i++){
        if(bb*(maxd+1-d)<=i*aa)break;v[d]=i;
    }
}

 

以上是关于c语言,如何从确定的二位数组中任取其中2元素,才能不重不漏得把所有情况取到?的主要内容,如果未能解决你的问题,请参考以下文章

n球中任取m个(不放回)

编写一个递归算法,找出从自然数1,2,3,…,n中任取r个数的所有组合。例如n=5,r=3时所有组合为543,542,541,532,531,521,432,431,421,321。

CF1598D Training Session题解

STL 全排列

C语言10个数字判断问题

温习全排列