zoukankan      html  css  js  c++  java
  • nyoj--1233--差值(贪心模拟+大数)

    差值

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:3
    描述

         输入一个整数数组,将它们连接起来排成一个数,找出能排出的所有数字中最大,最小的两个,输出两个数的差值。例如输入数组{1,  2},则输出9


    输入
    第一行输入一个整数T,表示有T组测试数据。每组测试数据的第一行输入一个整数n(0<n<=1000),第二行输入n个整数ai(0<=ai<2^32)。
    输出
    输出最大数最小数的差值,输出占一行。
    样例输入
    1
    3
    1 2 3
    样例输出
    198
    上传者

    ZWZ530



    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int a[10010],b[10010];
    char c[10010];
    struct node
    {
    	char s[22];
    }num[10100];
    bool cmp(node s1,node s2)
    {
    	int l1=strlen(s1.s);
    	int l2=strlen(s2.s);
    	int l=max(l1,l2);
    	for(int i=0;i<l;i++)
    	{
    		if(s1.s[i%l1]>s2.s[i%l2])
    		return false;
    		else if(s1.s[i%l1]<s2.s[i%l2])
    		return true;
    	}
    	return true;
    }
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--)
    	{
    		int n;
    		scanf("%d",&n);
    		for(int i=0;i<n;i++)
    			scanf("%s",num[i].s);
    		sort(num,num+n,cmp);
    		memset(c,0,sizeof(c));
    		for(int i=0;i<n;i++)
    			strcat(c,num[i].s);
    		int l=strlen(c);
    		int j=0;
    		for(int i=0;i<l;i++)
    			a[j++]=c[i]-'0';
    		memset(c,0,sizeof(c));
    		for(int i=n-1;i>=0;i--)
    			strcat(c,num[i].s);
    		j=0;
    		for(int i=0;i<l;i++)
    			b[j++]=c[i]-'0';
    		for(int i=l-1;i>=0;i--)
    		{
    			if(a[i]>b[i])
    			{
    				b[i-1]--;
    				b[i]+=10;
    			}
    			b[i]=b[i]-a[i];
    		}
    		for(j=0;j<l;j++)
    		{
    			if(b[j])
    			break;
    		}
    		if(j==l) printf("0");
    		for(int i=j;i<l;i++)
    		printf("%d",b[i]);
    		printf("
    ");
    	}
    	return 0;
    }



  • 相关阅读:
    字符串算法—正则表达式
    字符串算法—字符串搜索
    字符串算法—字典树
    字符串算法—字符串排序(下篇)
    字符串算法—字符串排序(上篇)
    图表算法—最短路径
    基本算法——前缀和与差分
    图论——图的表示
    基本算法——康托展开与逆康托展开
    基本算法——离散化
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273674.html
Copyright © 2011-2022 走看看