c语言输入,第一行表示数据组数,第二行表示第一组元素个数,第三行输入元素,后面依次,例 2 6 2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言输入,第一行表示数据组数,第二行表示第一组元素个数,第三行输入元素,后面依次,例 2 6 2相关的知识,希望对你有一定的参考价值。

c语言输入,第一行表示数据组数,第二行表示第一组元素个数,第三行输入元素,后面依次,例
2
6
23 56 89 4 2 3
5
95 52 14 36 5

咋么才能实现呢?

结构体+动态内存分配

#include "stdio.h"
#include "stdlib.h"
struct Co

  int num;
  int *content;
;
int main()

   int total=0,i,j;
   Co *p=NULL;
   scanf("%d",&total);
   p=(Co *)malloc(total*sizeof(Co));
   for(i=0;i<total;i++)
   
      scanf("%d",&(p[i].num));
      p[i].content=(int *)malloc(p[i].num *sizeof(int));
      for(j=0;j<p[i].num;j++)
      
        scanf("%d",p[i].content+j);
      
   
   printf("Output:\\n");
   for(i=0;i<total;i++)
   
     for(j=0;j<p[i].num;j++)
     
       printf("%d ",(p[i].content)[j]);
      
 free(p[i].content);
     printf("\\n");  
   
   free(p);
 

可以看到,你输入的11个数正确输出

追问

我才刚学,,不用动态内存分配开个大数组能实现这个吗

追答

可以,但是太浪费空间,我的是最省空间的办法,如果没学的话,就用大数组也可以实现。

参考技术A #include<stdio.h>
#include<stdlib.h>
int main(void)

    int *p[50],n,number;
    int i,j;

    printf("输入数据组数\\n");
    scanf("%d",&n);
    for(i = 0 ; i < n; i++)
    
        printf("请输入第%d组数据个数\\n",i+1);
        scanf("%d",&number);
        p[i] = (int *)malloc(sizeof(int)*numer); //头文件stdlib.h
        printf("轻依次输入数据\\n");
        for(j = 0 ; j < numer; j++)
        
            scanf("%d",p[i]+j);
        
    
    
    return 0;

参考技术B

#include <stdio.h>
int a[100][100],b[100];
int main(int argc, char *argv[])

 int i,j,n;
 scanf("%d",&n);
 for(i=0;i<n;i++)
 
  scanf("%d",&b[i]);
  for(j=0;j<b[i];j++)
   scanf("%d",&a[i][j]);
 
 printf("\\n%d\\n",n);
 for(i=0;i<n;i++)
 
  printf("%d\\n",b[i]);
  for(j=0;j<b[i];j++)
   printf("%d ",a[i][j]);
  putchar(10);
 
 return 0;


[CSP-S模拟测试]:装饰(数学)

题目传送门(内部题147)


输入格式

  每个测试点第一行一个正整数$T$,表示该测试点内的数据组数。
  接下来$T$行,每行三个非负整数$a,b,c$,含义如题目中所示。


输出格式

  对每组数据输出一行一个非负整数表示答案。


样例

样例输入:

5
1 2 3
5 0 0
9 1 1
5 5 4
0 6 6

样例输出:

2
0
2
4
4


数据范围与提示

样例解释:

  第一组数据中,可以装饰出红黄蓝、黄蓝蓝两张桌子;
  第二组数据中只有红色的气球,无法装饰任何桌子;
  第三组数据中,只能装饰两张桌子,颜色分别为红红黄和红红蓝,而剩下的$5$个红色气球无法使用。
  第四组数据中,可以装饰四张颜色为红黄蓝的桌子,剩余的一个红色气球和一个蓝色气球无法使用。
  最后一组数据中,可以装饰黄蓝蓝和黄黄蓝的桌子各两张。

数据范围:

  对于$30\\%$的数据,有$a,b,cleqslant 5$,
  对于$60\\%$的数据,有$a,b,c,Tleqslant 500$,
  对于$100\\%$的数据,有$0leqslant a,b,cleqslant 1000000000$(即$1000^3$),$1leqslant Tleqslant 20,000$。


题解

先说一下$60\\%$的暴力吧。

设$dp[i][j][k]$表示红色有$i$个,黄色有$j$个,蓝色有$k$个的情况下最多能装饰几个桌子。

有转移:

$$dp[i][j][k]=max(dp[i-1][j-1][k-1],dp[i-2][j-1][k],dp[i-1][j-2][k],dp[i-2][j][k-1],dp[i-1][j][k-2],dp[i][j-2][k-1],dp[i][j-1][k-2])$$

注意空间问题(不然会$MLE0$,比方说某同桌),但是因为答案很小,所以用$short$就好啦。

正解其实是找规律找出来的,无意间发现当数量最少的两个球相加乘$2$还比另一个球少的情况下答案就是这两个球的加和;否则答案就是三个球数量加和的$frac{1}{3}$。

时间复杂度:$Theta(T)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
long long a[3];
int main()
{
	int T;scanf("%d",&T);
	while(T--)
	{
		scanf("%lld%lld%lld",&a[0],&a[1],&a[2]);sort(a,a+3);
		printf("%lld
",(a[0]+a[1])*2<a[2]?a[0]+a[1]:(a[0]+a[1]+a[2])/3);
	}
	return 0;
}

rp++

以上是关于c语言输入,第一行表示数据组数,第二行表示第一组元素个数,第三行输入元素,后面依次,例 2 6 2的主要内容,如果未能解决你的问题,请参考以下文章

[CSP-S模拟测试]:最大异或和(数学)

Java洗牌

问题 B: 分组统计

[CSP-S模拟测试]:装饰(数学)

雅礼培训 1.2

bzoj5074[Lydsy十月月赛]小B的数字 数学