Shorten IPv6 Address

题目链接

题意:转换一个128位的二进制串,变成16进制,并且格式为x:x:x:x:x:x:x:x然后多个相邻的0变成::,且只有一个::,求变成的字典序最小且最短的字符串。

思路:大水题,但是就是一直wa,思路都一样的还是wa。先将二进制转化为十进制,然后用%x输出,因为连续的0可变短,但有优先级,首先选0长的,然后如果长度相等,先选中间,中间里面先选中间偏后,然后是最后,最后是前面。差不多就这意思吧。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#define ll long long
using namespace std;
const int N = 1000 + 10;
char s[N];int a[10], r[10];
int main() { 
    int T;   
    scanf("%d", &T);  
    for (int tii = 1; tii <= T; tii++) {
        scanf("%s", s + 1);    
        for (int i = 1; i <= 8; i++) {
            a[i] = 0;         
            for (int j = 1; j <= 16; j++) {
                a[i] = a[i] * 2 + s[(i - 1) * 16 + j] - '0';
            }      
        }      
        memset(r, 0, sizeof(r)); 
        printf("Case #%d: ", tii);    
        int id = 0;      
        for (int i = 8; i > 0; i--) {  
            if (a[i] == 0) r[i] = r[i + 1] + 1;    
            if (r[id] < r[i]) id = i;       
            if (r[id] == r[i] && r[id] + id - 1 == 8 && i != 1) id = i;
        }        for (int i = 1; i <= 8; i++) { 
            if (id == i && r[i] >= 2) {         
                if (id == 1) 
                printf(":");       
                printf(":");         
                i += r[id] - 1;  
            }
            else {  
                printf("%x", a[i]);
                if (i != 8)
                printf(":");  
            }    
        }     
        printf("
");   
    }  
    return 0;
}
原文地址:https://www.cnblogs.com/2462478392Lee/p/11296166.html