FZU ICPC 2020 寒假训练 2
A - 排序
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若
干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由
若干个‘0’组成的,这时这个整数就是0)。 你的任务是:对这些分割得到的整数,依从小
到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
WrongAnswer
#include <stdio.h>
#include <string.h>
int main() {
char str[10000];
long len;
int min,temp;
while(scanf("%s",str)!=EOF){
int i,j=0,k,p=0;
int a[10000]={0};
len=strlen(str);
for(i=0;i<len;i++){
if((i!=0&&str[i]=='5')||(i==len-1&&str[i]!='5')) {
for(k=j;k<=i;k++){
if(str[k]=='5') continue;
a[p]=a[p]*10+(str[k]-'0');
}
j=i+1;
p++;
}
}
for(i=0;i<p;i++){
min=i;
for(j=i+1;j<p;j++)
if(a[j]<a[min])
{
min=j;
}
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
for(i=0;i<p;i++){
printf("%d",a[i]);
if(i!=p-1) printf(" ");
else printf("\n");
}}
return 0;
}
错误原因:忽略了如果输入字符串为如55512355的情况(有多个连续5),如果这样会导致p自增多次,从而造成,结果输出多个0;
修改:增加一个变量flag,控制p自增;
Accepted
#include <stdio.h>
#include <string.h>
int main() {
char str[10000];
long len;
int min,temp;
while(scanf("%s",str)!=EOF){
int i,j=0,k,p=0;
int a[10000]={0};
len=strlen(str);
for(i=0;i<len;i++){
int flag=0;//注意!!
if((i!=0&&str[i]=='5')||(i==len-1&&str[i]!='5')) {
for(k=j;k<=i;k++){
if(str[k]=='5') continue;
else {flag=1; a[p]=a[p]*10+(str[k]-'0');}//注意!!
}
j=i+1;
if(flag==1) p++;
}
}
for(i=0;i<p;i++){
min=i;
for(j=i+1;j<p;j++)
if(a[j]<a[min])
{
min=j;
}
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
for(i=0;i<p;i++){
printf("%d",a[i]);
if(i!=p-1) printf(" ");
else printf("\n");
}}
return 0;
}
B - 18岁生日
Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出
生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你
帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
Input
一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。
Output
T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。
Sample Input
1
1988-03-07
Sample Output
6574
Accepted
#include <stdio.h>
#include <string.h>
int judge_year(int year)
{
if((year%4==0&&year%100!=0)||(year%400==0)) return 1;
else return 0;
}
int main() {
int t,i,y;
int year,month,day;
int sum=0;
scanf("%d",&t);
for(i=1;i<=t;i++){
sum=0;
scanf("%d-%d-%d",&year,&month,&day);
if(month==2&&day==29) {printf("-1\n");continue;}
else if (month<3) {//如果出生在3月份之前,当前年的天数,就是到第二年生日的天数
for(y=year;y<=year+17;y++){
if(judge_year(y)) sum+=366;
else sum+=365;
}
}
else if(month>=3){//如果出生在3月份之后,后一年的天数,就是到第二年生日的天数
for(y=year+1;y<=year+18;y++){
if(judge_year(y)) sum+=366;
else sum+=365;
}
}
printf("%d\n",sum);
}
return 0;
}
C - 七夕节
七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的
另一半是谁吗?那就按照告示上的方法去找吧!" 人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:
数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
你想知道你的另一半吗?
Input
输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只
有一个数字N(1<=N<=500000).
Output
对于每组测试数据,请输出一个代表输入数据N的另一半的编号.
Sample Input
3
2
10
20
Sample Output
1
8
22
WrongAnswer
#include <stdio.h>
int main(){
int t,n,m=0,i,j;
scanf("%d",&t);
for(i=1;i<=t;i++){
m=0;
scanf("%d",&n);
for(j=1;j<n;j++){
if(n%j==0) m+=j;
}
printf("%d\n",m);
}
return 0;
}
刚刚开始想法很简单,用一个for循环把n所有的因子找出来,但是提交发现,超时,说明这种做法当数据过大时,消耗时间过大,因此就转换了另一种思路。[参考] C语言-求因子和
Accepted
#include <math.h>
int main(){
int t,n,m=0,i,j;
scanf("%d",&t);
for(i=1;i<=t;i++){
m=0;
scanf("%d",&n);
for(j=1;j<=sqrt(n);j++){
if(n%j==0){
if(j==n/j) m+=j;
else m=m+j+n/j;
}
}
m=m-n;
printf("%d\n",m);
}
return 0;
}
E - A + B
读入两个小于100的正整数A和B,计算A+B.
需要注意的是:A和B的每一位数字由对应的英文单词给出.
Input
测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.
当A和B同时为0时输入结束,相应的结果不要输出.
Output
对每个测试用例输出1行,即A+B的值.
Sample Input
one + two =
three four + five six =
zero seven + eight nine =
zero + zero =
Sample Output
3
90
96
Accepted
#include <stdio.h>
#include <string.h>
int judge(char str[]){
if(!strcmp(str,"zero")) return 0;
else if(!strcmp(str,"one")) return 1;
else if(!strcmp(str,"two")) return 2;
else if(!strcmp(str,"three")) return 3;
else if(!strcmp(str,"four")) return 4;
else if(!strcmp(str,"five")) return 5;
else if(!strcmp(str,"six")) return 6;
else if(!strcmp(str,"seven")) return 7;
else if(!strcmp(str,"eight")) return 8;
else if(!strcmp(str,"nine")) return 9;
else return 0;
}
int main(){
while(1){
int sum1=0,sum2=0,sum=0;
char str1[1005]={0};
int i=0,j=0;
int len=0;
while(1){
scanf("%c",&str1[i]);
if(str1[i]=='\n') break; //这一步非常关键,刚开始,我选择条件为’=‘时,就会导致后续输入的例子,不能完整得出原数, 原因为,输入的’\n‘被字符串接收了,从而导致后面的字符无法得出对应数字.
if(str1[i]==' ') {
str1[i]=0;
sum1=sum1*10+judge(str1);
len=(int)strlen(str1);
for(j=0;j<len;j++) str1[j]=0;
i=-1;
}
if(str1[i]=='+') {
sum2=sum1;
sum1=0;
continue;}
i++;
}
sum=sum1+sum2;
if(sum==0) break;
else printf("%d\n",sum);
}
return 0;
}
J - 前m大的数
还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张
数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希只想让你把答
案中最大的M个数告诉她就可以了。 给定一个包含N(N<=3000)个正整数的序列,每个数不超过
5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=1000)并按从大到小的
顺序排列。
Input
输入可能包含多组数据,其中每组数据包括两行:
第一行两个数N和M,
第二行N个数,表示该序列。
Output
对于输入的每组数据,输出M个数,表示结果。输出应当按照从大到小的顺序排列。
Sample Input
4 4
1 2 3 4
4 5
5 3 6 4
Sample Output
7 6 5 5
11 10 9 9 8
Time Limit Exceeded
#include <stdio.h>
#include <math.h>
int main(){
int m,n,a[1005],b[1005];
int i,j,k,temp;
while(scanf("%d %d",&n,&m)!=EOF){
k=0;
for(i=0;i<n;i++)scanf("%d",&a[i]);
for(i=0;i<n;i++){
for(j=i+1;j<n;j++,k++) b[k]=a[i]+a[j];
}
for(i=0;i<k;i++){
for(j=i+1;j<k;j++){
if(b[i]<b[j]){
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
}
for(i=0;i<m;i++){
printf("%d",b[i]);
if(i!=m-1) printf(" ");
else printf("\n");
}
}
return 0;
}
第一次提交超时了,所以在想,会不会是在排序上花的时间过长,所以就采取了c++sort 函数(默认升序排列)
#include <stdio.h>
#include<algorithm>
using namespace std;
bool compare(int a,int b)
{return a>b;}
int main(){
int m,n;
int i,j,k;
while(scanf("%d %d",&n,&m)!=EOF){
k=0;
int a[1000005]={0},b[1000005]={0};
for(i=0;i<n;i++)scanf("%d",&a[i]);
for(i=0;i<n;i++){
for(j=i+1;j<n;j++,k++) b[k]=a[i]+a[j];
}
sort(b,b+k,compare);
for(i=0;i<m-1;i++)
printf("%d ",b[i]);
printf("%d\n",b[m-1]);
}
return 0;
}
但是有发现,还是Runtime error了,之后在查询资料后,发现是数组开的过小,使其溢出,但是如果在main函数里定义数组过大,会使栈溢出,故设全局变量。
Accepted
#include <stdio.h>
#include<algorithm>
int a[3005]={0},b[4500005]={0};
using namespace std;
bool compare(int a,int b)
{return a>b;}
int main(){
int m,n;
int i,j,k;
while(scanf("%d %d",&n,&m)!=EOF){
k=0;
for(i=0;i<n;i++) scanf("%d",&a[i]);
for(i=0;i<n;i++){
for(j=i+1;j<n;j++) b[k++]=a[i]+a[j];
}
sort(b,b+(n*(n-1)/2),compare);
for(i=0;i<m-1;i++)
printf("%d ",b[i]);
printf("%d\n",b[m-1]);
}
return 0;
}
后面也了解了相关原理:常用的两种nlogn级别的排序——快排,归排
K - 找新朋友
新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编
号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于
1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计
算出来。
Input
第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。
Output
对于每一个N,输出一行新朋友的人数,这样共有CN行输出。
Sample Input
2
25608
24027
Sample Output
7680
16016
Time Limit Exceeded
#include <stdio.h>
int find(int a,int b){
if(b==0&&a!=1) return 1;
if(b==0&&a==1) return 0;
return find(b,a%b);
}
int main(){
int n,cn,i,j;
int num,flag;
scanf("%d",&cn);
for(i=1;i<=cn;i++){
num=0;
scanf("%d",&n);
for(j=1;j<n;j++){
flag=find(n,j);
if(flag==0) num++;
}
printf("%d\n",num);
}
return 0;
}
一开始想到了gcd,但是gcd函数采用递归的方法,所以是遍历查找,故会超时。
Accepted
查询资料后,发现本题应该用筛选法处理(还有一个欧拉公式??)
#include<stdio.h>
#include<math.h>
int main()
{
int a[32770];
int i,j,cn,n;
scanf("%d",&cn);
while(cn--)
{
scanf("%d",&n);
memset(a,0,sizeof(a));// memset可以方便的清空一个结构类型的变量或数组。
for(i=2;i<=sqrt(n);i++) //筛选法求约数关系
if(n%i==0)
for(j=i;j<n;j+=i)
a[j]=1;
int sum=0;
for(i=1;i<n;i++)
if(!a[i])
sum++;
printf("%d\n",sum);
}
return 0;
}
#include <stdio.h>
#include <math.h>
int Eular(int n)
{
int ans=1;
for (int i=2;i<=sqrt((double)n);i++)
{
if (n%i==0)
{
n/=i;
ans*=(i-1);
//若n有个因子是i的k次,根据欧拉公式有下面的代码
while (n%i==0)
{
n/=i;
ans*=i;
}
}
}
if (n>1) //若最后剩的数为大于5的素数,根据欧拉公式再算进去
ans*=(n-1);
return ans;
}
int main(){
int n,cn,i;
scanf("%d",&cn);
for(i=1;i<=cn;i++){
scanf("%d",&n);
printf("%d\n", Eular(n));
}
return 0;
}
M - 测试你是否和LTC水平一样高
大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个
水平线上! 你的任务是: 计算方程x^2+y^2+z^2= num的一个正整数解。
Input
输入数据包含多个测试实例,每个实例占一行,仅仅包含一个小于等于10000的正整数num。
Output
对于每组测试数据,请按照x,y,z递增的顺序输出它的一个最小正整数解,每个实例的输出占一行,题目保证所有测试数据都有解。
Sample Input
3
Sample Output
1 1 1
Accepted
这题首先注意输入n的范围1~10000,所以只要在1~100范围内三层循环嵌套,便可得出答案
#include<stdio.h>
#include<math.h>
int main()
{
int num,i,k,j,flag;
while(scanf("%d",&num)!=EOF){
flag=0;
for(i=1;i<=100;i++){
for(j=1;j<=100;j++){
for(k=1;k<=100;k++){
if(i*i+j*j+k*k==num) {flag=1;break;}
}
if(flag) break;
}
if(flag) break;
}
printf("%d %d %d\n",i,j,k);
}
return 0;
}
N - 素数回文
xiaoou33对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在
xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间
满足条件的数。(5 <= a < b <= 100,000,000);
Input
这里有许多组数据,每组包括两组数据a跟b。
Output
对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。
Sample Input
5 500
Sample Output
5
7
11
101
131
151
181
191
313
353
373
383
Time Limit Exceeded
#include<stdio.h>
#include<math.h>
int judge1(int n){
int i;
if(n==1) return 0;
else if(n==2) return 1;
else if(n>2) {
for (i=2;i<=sqrt(n);i++ ) {
if(n%i==0) return 0;
}
return 1;
}
return 0;
}
int judge2(int n){
int s,m=0;
s=n;
while(s>0){
m=m*10+s%10;
s/=10;
}
if(m==n) return 1;
else return 0;
}
int main()
{
int a,b,i,temp;
while(scanf("%d %d",&a,&b)!=EOF){
int flag1=0,flag2=0;
if(a>b){
temp=a;
a=b;
b=temp;
}
for(i=a;i<=b;i++){
flag1=judge1(i);
flag2=judge2(i);
if(flag1&&flag2)printf("%d\n",i);
}
}
return 0;
}
Accepted
回文素数:除了11,偶数位的数不存在回文质数。4位,6位,8位……数不存在回文质数。因为四位及四位以上的偶数位的回文数都可以被11整除,故不存在偶数位的回文质数。
方法1:暴力打表(因为范围内的最大回文素数为9989899)
#include<stdio.h>
int arr[]={2,3,5,7,11,101,131,151,181,191,
313,353,373,383,727,757,787,797,919,929,
10301,10501,10601,11311,11411,12421,12721,12821,13331,13831,
13931,14341,14741,15451,15551,16061,16361,16561,16661,17471,
17971,18181,18481,19391,19891,19991,30103,30203,30403,30703,
30803,31013,31513,32323,32423,33533,34543,34843,35053,35153,
35353,35753,36263,36563,37273,37573,38083,38183,38783,39293,
70207,70507,70607,71317,71917,72227,72727,73037,73237,73637,
74047,74747,75557,76367,76667,77377,77477,77977,78487,78787,
78887,79397,79697,79997,90709,91019,93139,93239,93739,94049,
94349,94649,94849,94949,95959,96269,96469,96769,97379,97579,
97879,98389,98689,1003001,1008001,1022201,1028201,1035301,1043401,1055501,
1062601,1065601,1074701,1082801,1085801,1092901,1093901,1114111,1117111,1120211,
1123211,1126211,1129211,1134311,1145411,1150511,1153511,1160611,1163611,1175711,
1177711,1178711,1180811,1183811,1186811,1190911,1193911,1196911,1201021,1208021,
1212121,1215121,1218121,1221221,1235321,1242421,1243421,1245421,1250521,1253521,
1257521,1262621,1268621,1273721,1276721,1278721,1280821,1281821,1286821,1287821,
1300031,1303031,1311131,1317131,1327231,1328231,1333331,1335331,1338331,1343431,
1360631,1362631,1363631,1371731,1374731,1390931,1407041,1409041,1411141,1412141,
1422241,1437341,1444441,1447441,1452541,1456541,1461641,1463641,1464641,1469641,
1486841,1489841,1490941,1496941,1508051,1513151,1520251,1532351,1535351,1542451,
1548451,1550551,1551551,1556551,1557551,1565651,1572751,1579751,1580851,1583851,
1589851,1594951,1597951,1598951,1600061,1609061,1611161,1616161,1628261,1630361,
1633361,1640461,1643461,1646461,1654561,1657561,1658561,1660661,1670761,1684861,
1685861,1688861,1695961,1703071,1707071,1712171,1714171,1730371,1734371,1737371,
1748471,1755571,1761671,1764671,1777771,1793971,1802081,1805081,1820281,1823281,
1824281,1826281,1829281,1831381,1832381,1842481,1851581,1853581,1856581,1865681,
1876781,1878781,1879781,1880881,1881881,1883881,1884881,1895981,1903091,1908091,
1909091,1917191,1924291,1930391,1936391,1941491,1951591,1952591,1957591,1958591,
1963691,1968691,1969691,1970791,1976791,1981891,1982891,1984891,1987891,1988891,
1993991,1995991,1998991,3001003,3002003,3007003,3016103,3026203,3064603,3065603,
3072703,3073703,3075703,3083803,3089803,3091903,3095903,3103013,3106013,3127213,
3135313,3140413,3155513,3158513,3160613,3166613,3181813,3187813,3193913,3196913,
3198913,3211123,3212123,3218123,3222223,3223223,3228223,3233323,3236323,3241423,
3245423,3252523,3256523,3258523,3260623,3267623,3272723,3283823,3285823,3286823,
3288823,3291923,3293923,3304033,3305033,3307033,3310133,3315133,3319133,3321233,
3329233,3331333,3337333,3343433,3353533,3362633,3364633,3365633,3368633,3380833,
3391933,3392933,3400043,3411143,3417143,3424243,3425243,3427243,3439343,3441443,
3443443,3444443,3447443,3449443,3452543,3460643,3466643,3470743,3479743,3485843,
3487843,3503053,3515153,3517153,3528253,3541453,3553553,3558553,3563653,3569653,
3586853,3589853,3590953,3591953,3594953,3601063,3607063,3618163,3621263,3627263,
3635363,3643463,3646463,3670763,3673763,3680863,3689863,3698963,3708073,3709073,
3716173,3717173,3721273,3722273,3728273,3732373,3743473,3746473,3762673,3763673,
3765673,3768673,3769673,3773773,3774773,3781873,3784873,3792973,3793973,3799973,
3804083,3806083,3812183,3814183,3826283,3829283,3836383,3842483,3853583,3858583,
3863683,3864683,3867683,3869683,3871783,3878783,3893983,3899983,3913193,3916193,
3918193,3924293,3927293,3931393,3938393,3942493,3946493,3948493,3964693,3970793,
3983893,3991993,3994993,3997993,3998993,7014107,7035307,7036307,7041407,7046407,
7057507,7065607,7069607,7073707,7079707,7082807,7084807,7087807,7093907,7096907,
7100017,7114117,7115117,7118117,7129217,7134317,7136317,7141417,7145417,7155517,
7156517,7158517,7159517,7177717,7190917,7194917,7215127,7226227,7246427,7249427,
7250527,7256527,7257527,7261627,7267627,7276727,7278727,7291927,7300037,7302037,
7310137,7314137,7324237,7327237,7347437,7352537,7354537,7362637,7365637,7381837,
7388837,7392937,7401047,7403047,7409047,7415147,7434347,7436347,7439347,7452547,
7461647,7466647,7472747,7475747,7485847,7486847,7489847,7493947,7507057,7508057,
7518157,7519157,7521257,7527257,7540457,7562657,7564657,7576757,7586857,7592957,
7594957,7600067,7611167,7619167,7622267,7630367,7632367,7644467,7654567,7662667,
7665667,7666667,7668667,7669667,7674767,7681867,7690967,7693967,7696967,7715177,
7718177,7722277,7729277,7733377,7742477,7747477,7750577,7758577,7764677,7772777,
7774777,7778777,7782877,7783877,7791977,7794977,7807087,7819187,7820287,7821287,
7831387,7832387,7838387,7843487,7850587,7856587,7865687,7867687,7868687,7873787,
7884887,7891987,7897987,7913197,7916197,7930397,7933397,7935397,7938397,7941497,
7943497,7949497,7957597,7958597,7960697,7977797,7984897,7985897,7987897,7996997,
9002009,9015109,9024209,9037309,9042409,9043409,9045409,9046409,9049409,9067609,
9073709,9076709,9078709,9091909,9095909,9103019,9109019,9110119,9127219,9128219,
9136319,9149419,9169619,9173719,9174719,9179719,9185819,9196919,9199919,9200029,
9209029,9212129,9217129,9222229,9223229,9230329,9231329,9255529,9269629,9271729,
9277729,9280829,9286829,9289829,9318139,9320239,9324239,9329239,9332339,9338339,
9351539,9357539,9375739,9384839,9397939,9400049,9414149,9419149,9433349,9439349,
9440449,9446449,9451549,9470749,9477749,9492949,9493949,9495949,9504059,9514159,
9526259,9529259,9547459,9556559,9558559,9561659,9577759,9583859,9585859,9586859,
9601069,9602069,9604069,9610169,9620269,9624269,9626269,9632369,9634369,9645469,
9650569,9657569,9670769,9686869,9700079,9709079,9711179,9714179,9724279,9727279,
9732379,9733379,9743479,9749479,9752579,9754579,9758579,9762679,9770779,9776779,
9779779,9781879,9782879,9787879,9788879,9795979,9801089,9807089,9809089,9817189,
9818189,9820289,9822289,9836389,9837389,9845489,9852589,9871789,9888889,9889889,
9896989,9902099,9907099,9908099,9916199,9918199,9919199,9921299,9923299,9926299,
9927299,9931399,9932399,9935399,9938399,9957599,9965699,9978799,9980899,9981899,
9989899,-1};
int main()
{
int a,b,i;
while(scanf("%d %d",&a,&b)!=EOF){
for(i=0;arr[i]!=-1;i++)
{
if(arr[i]>=a&&arr[i]<=b) printf("%d\n",arr[i]);
if(arr[i]>b) break;
}
printf("\n");
}
return 0;
}
方法2 HDU 1431 素数回文(打表+技巧,最大回文素数为9989899!!!)
P - 排列2
Ray又对数字的列产生了兴趣:现有四张卡片,用这四张卡片能排列出很多不
同的4位数,要求按从小到大的顺序输出这些4位数。
Input
每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。
Output
对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在
同一行,同一行中每个四位数间用空格分隔。 每组输出数据间空一行,最后一组数据后面
没有空行。
Sample Input
1 2 3 4
1 1 2 3
0 1 2 3
0 0 0 0
Sample Output
1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321
1123 1132 1213 1231 1312 1321
2113 2131 2311
3112 3121 3211
1023 1032 1203 1230 1302 1320
2013 2031 2103 2130 2301 2310
3012 3021 3102 3120 3201 3210
Accepted
本题采用c++stl库中的全排列(全排列 next_permutation() 函数的用法)函数:
#include<stdio.h>
#include<string.h>
#include<algorithm>
int main()
{
int a[5];
int tag=0;
while(scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3])){
if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0) break;
if(tag) printf("\n"); //控制换行
tag=1;
int flag=1,temp;
do{
if(a[0]==0) continue;
if(flag){
printf("%d%d%d%d",a[0],a[1],a[2],a[3]);
flag=0;
}
else if(temp==a[0])
printf(" %d%d%d%d",a[0],a[1],a[2],a[3]);
else printf("\n%d%d%d%d",a[0],a[1],a[2],a[3]);
temp=a[0];}while(std::next_permutation(a,a+4));
printf("\n");
}
return 0;
}
FZU ICPC 2020 寒假训练 2的更多相关文章
- FZU ICPC 2020 寒假训练 4 —— 模拟(一)
P1042 乒乓球 题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华华 ...
- FZU ICPC 2020 寒假训练 6 —— 字符串处理
P1603 斯诺登的密码 题目描述 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机.但是,这件事情太不周密了,因为FBI的间谍早已获悉他的具体位置--但这不是最重要的 ...
- FZU ICPC 2020 寒假训练 5 —— 排序
P1177 [模板]快速排序 题目描述 利用快速排序算法将读入的 N 个数从小到大排序后输出.快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成. ...
- FZU ICPC 2020 寒假训练 4 —— 模拟(二)
P1056 排座椅 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的 D 对同 ...
- FZU ICPC 2020 寒假训练 3
P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数.现在,请你编程实现这一功能,具体要求是:给定一 ...
- FZU ICPC 2020 寒假训练 1
B - Sum Problem In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n. Input The i ...
- FZU ICPC 2020 寒假阶段测试 2
P1464 Function 题目描述 对于一个递归函数w(a,b,c)如果a≤0 or b≤0 or c≤0就返回值1.如果a>20 or b>20 or c>20就返回w(20, ...
- 寒假训练第九场 Brocard Point of a Triangle
题意:求布洛卡点坐标 思路:直接利用布洛卡点的性质.http://pan.baidu.com/s/1eQiP76E #include<cstdio> #include<cstring ...
- FJUT2017寒假训练二题解
A题 题意:让你找出唯一的一个四位数,满足对话时的要求. 思路:因为是4位数,可以直接从1000-9999遍历一遍,判断是否有唯一的数能满足所有条件,如果不是唯一的或者没有满足条件的数就输出Not s ...
随机推荐
- storm卡顿修改
最近的webstorm越来越卡了,有时候甚至会弹出 Out of memory的窗口,提示要设置 xmx的值, 8G内存跑你这小软件还会不够用???要内存?给你,看你还会不会卡成翔! 于是果断给x ...
- 后缀自动机(SAM)奶妈式教程
后缀自动机(SAM) 为了方便,我们做出如下约定: "后缀自动机" (Suffix Automaton) 在后文中简称为 SAM . 记 \(|S|\) 为字符串 \(S\) 的长 ...
- Django开发个人博客入门学习经验贴
[写在前面] 入门学习搭建个人博客系统首先还是参考大佬们的经验,记得刚入手Django的时候,一篇博客大佬说过一句话,做技术的不要一开始就扎头于细节中,先把握整体框架,了解这个对象之后再去了解细节,进 ...
- Object.create 和 Object.assign
Object.assign(target, ...source) 1.Object.assign方法只会拷贝源对象自身(不包括原型)的并且可枚举的属性到目标对象,使用源对象的get和目标对象的set, ...
- 2021.9.9考试总结[NOIP模拟50]
T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...
- python2和python3并存下的pip使用
py -2 -m pip install *.whl py -3 -m pip intall *.wl
- camera isp(Image Signal Processor)
1. 目标[52RD.com] 手机摄像头模组用ISP功能模块的市场走向及研发方向.为能够正确认识手机摄像模组行业提供技术及市场依据.[52RD.com] 2. ISP在模组上的应用原理[52RD.c ...
- 利用Nginx搭建Ambari本地安装源
1.下载本地源包https://docs.hortonworks.com/HDPDocuments/Ambari-2.7.3.0/bk_ambari-installation/content/ch_o ...
- linux c语言 rename的用法-rename() does not work across different mount points, even if the same file system is mounted on both
最近在一个项目上执行文件的搬移功能时发现总是失败,临时录像文件存放于emmc的/tmp/目录下,当录像完成时候则调用rename企图将此文件搬到/mnt/sdcard/mmcblk1p1/(这是外置的 ...
- AC-DCN ESXi
传统IT架构中的网络,根据业务需求部署上线以后,如果业务需求发生变动,重新修改相应网络设备(路由器.交换机.防火墙)上的配置是一件非常繁琐的事情.在互联网/移动互联网瞬息万变的业务环境下,网络的高稳定 ...