2021-01-19 总结

2021-01-19 总结

*1.、最大整数
【问题描述】
设有 n 个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3 时,3 个整数 13,312,343 联接成的最大整数为:34331213
又如:n=4 时,4 个整数 7,13,4,246 联接成的最大整数为:7424613
【输入格式】
n
n 个数
【输出格式】
联接成的多位数
【输入样例】
3
13 312 343
【输出样例】
34331213
这道题呢,是之前做过的一道题,我也就没想那么多,用之前的贪心的方法写的。
今天写的过程中,突然奇思妙想,能不能用 double 定义这 n 个数,通过不断地除10,把这 n 个数转化到同样的位上,比如样例中,13 变成 0.13 ,312 变成 0.312,343 变成 0.343,然后比较转化完的数,从大到小排序,再按原数据输出。但是后来写了一下,提交得了 80 分,
看到数据才反应过来位数不同我没细考虑。
如 2
34 341
最大肯定是 34341 ,但是按我的想法就变成了 34134。
关于这道题,今天还学会了一个新奇的写法,用字典序排序,代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
string a[21];
bool cmp(string a,string b)
{
    
    
	return a+b>b+a;
}
int main()
{
    
    
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
    
    
		cin>>a[i];
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
    
    
		cout<<a[i];
	}
	return 0;
}

2、最佳游览线路
【问题描述】
某旅游区的街道成网格状。其中东西向的街道都是旅游街,南北向的街道都是林荫道。
由于游客众多,旅游街被规定为单行道,游客在旅游街上只能从西向东走,在林阴道上则既
可从南向北走,也可以从北向南走。
阿龙想到这个旅游区游玩。他的好友阿福给了他一些建议,用分值表示所有旅游街相邻
两个路口之间的街道值得游览的程度,分值时从-100 到 100 的整数,所有林阴道不打分。
所有分值不可能全是负分。
例,如图是被打过分的某旅游区的街道图:

阿龙可以从任一个路口开始游览,在任一个路口结束游览。请你写一个程序,帮助阿龙
找一条最佳的游览线路,使得这条线路的所有分值总和最大。
【输入格式】
第一行是两个整数 M 和 N,之间用一个空格符隔开,M 表示有多少条旅游街(1≦M≦
100),N 表示有多少条林阴道(1≦M≦20001)。接下来的 M 行依次给出了由北向南每条旅
游街的分值信息。每行有 N-1 个整数,依次表示了自西向东旅游街每一小段的分值。同一
行相邻两个数之间用一个空格隔开。
【输出格式】
只有一行,是一个整数,表示你的程序找到的最佳游览线路的总分值。
【输入输出样例】(错误的)
travel.in
3 6(这个样例可是把我坑了好久)
-50 –47 36 –30 –23
17 –19 –34 –13 –8
-42 –3 –43 34 –45
travel.out
84
【输入输出样例】(正确的)
travel.in
3 5
-50 –47 36 –30 –23
17 –19 –34 –13 –8
-42 –3 –43 34 –45
travel.out
84
这道题卡了很长时间,一开始是因为样例给错了,输入输出一直没弄明白;
后来好不容易发现了样例的错误,程序能运行了,却发现输出和答案完全不一样,偶然听到同学在旁边讨论说什么不一定从头走到尾,才反应过来题里说:

阿龙可以从任一个路口开始游览,在任一个路口结束游览。

开始我审题错了,以为必须从西面起点走到东面终点呢(捂脸)
以下是改后代码,加上后来 x 和 y 写着写着就搞混了,这题做得可谓是一波三折:

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int num=0,x,y,sum,a[20010];
int main()
{
    
    
    scanf("%d%d",&x,&y);
    for(int i=1;i<=y;i++){
    
    
    	a[i]=-999;
	}  
    for(int i=1;i<=x;i++){
    
    
    	for(int j=1;j<=y;j++){
    
    
            int p;
            scanf("%d",&p);
            if(p>a[j]){
    
    
            	a[j]=p;
			}    
        }
	}
    for(int i=1;i<=y;i++){
    
    
        if(a[i]>=0){
    
    
        	num+=a[i];
            if(num>sum){
    
    
            	sum=num; 
			} 
        }
        else{
    
    
            if(num+a[i]<=0){
    
    
            	num=0;
			}
            else{
    
    
            	num+=a[i];
			}      
        }
    }
    printf("%d",sum);
    return 0;
}

另外,今天写代码的时候,sort 里面又忘写 cmp 了,希望这是我最后一次干这傻事。

猜你喜欢

转载自blog.csdn.net/chenweiye1/article/details/112850002