POJ 2718 Smallest Difference 未AC 《挑战程序设计竞赛》

题目:POJ 2718

思路:

分为奇数和偶数两种情况进行处理,输入个数为奇数的时候,无须穷举,最小差是一定的,如0 1 2 3 4,最小差为102 - 43。

输入个数为偶数的时候,用next_permutation穷举。

没有AC……

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <stdio.h>
 5 #include <string.h>
 6
 7 using namespace std;
 8
 9 int n;
10 int input[28];
11 char num[128];
12
13 long long pow10(int n)
14 {
15     long long ret = 1;
16     for (int i = 0 ;i < n; i++)
17     {
18         ret *= 10;
19     }
20     return ret;
21 }
22
23 int getNumber(int * addr, int count, bool isMin) {
24     int res = 0;
25     if (isMin) {
26         if (addr[0] == 0) {
27             swap(addr[0], addr[1]);
28         }
29         for (int i = count - 1; i >= 0; i--) {
30             res += *(addr + (count - 1 - i)) * pow10(i);
31         }
32     }
33     else {
34         for (int i = 0; i < count; i++) {
35             res += *(addr + i) * pow10(i);
36         }
37     }
38     return res;
39 }
40
41 int main() {
42     cin >> n;
43     cin.ignore();
44     int lc;    //left count
45     int rc;   //right count
46
47     int f;
48     int diff;
49     for (int i = 0; i < n; i++) {
50         int count = 0;
51         diff = 0x3f3f3f3f;
52         gets(num);
53         for (int i = 0; i < strlen(num); i++)
54         {
55             if (num[i] >= ‘0‘ && num[i] <= ‘9‘) input[count++] = num[i] - ‘0‘;
56         }
57
58         rc = count >> 1;    //left count
59         lc = count - rc;   //right count
60         if (count % 2 == 0) {
61             int tempCount = 0;
62             do {
63                 diff = min(diff, abs(getNumber(input, lc, 1) - getNumber(input + lc, rc, 1)));
64             } while (next_permutation(input, input + count));
65         }
66         else {
67             diff = min(diff, abs(getNumber(input, lc, 1) - getNumber(input + lc, rc, 0)));
68         }
69         cout << diff << endl;
70     }
71     return 0;
72 }

总结:

  • 在不知道输入个数的情况下接收,用gets()接收一行字符串,然后手动分割出来:
        gets(num);
        for (int i = 0; i < strlen(num); i++)
        {
            if (num[i] >= ‘0‘ && num[i] <= ‘9‘) input[count++] = num[i] - ‘0‘;
        }
  • 第一行输入n,后面要输入数据,n后面的换行符可以用cin.ignore()忽略。
时间: 2024-12-25 15:29:11

POJ 2718 Smallest Difference 未AC 《挑战程序设计竞赛》的相关文章

POJ 3420 Quad Tiling 题解 《挑战程序设计竞赛》

POJ 3420 Quad Tiling贴瓷砖:4*N的地板上用2*1的瓷砖铺满,求所有方案数对M求余.3.4熟练掌握动态规划矩阵的幂久违地上了节课,太无聊,只好刷一题.假设S[n]表示填满n时的方案数,有S[0]=1.定义矩阵M[p][q] := 边缘p和边缘q可以拼合时取1,否则取0所谓的可以拼合表示,两个边缘拼起来后长度为1(为2就拼接不起来了),且内部缝隙可以用2*1的瓷砖填满.那么M就有一些简单的性质了,比如M的第一行应该是:0 0 0 0 0 0... 继续阅读:码农场 » POJ

POJ 3411 Paid Roads 题解 《挑战程序设计竞赛》

POJ 3411 Paid Roads开路:N个城市间有m条单向路,分别从a到b,可以在c处交P路费,也可以直接交R路费.那么问题来了,你的挖掘机怎么开最省钱?3.4熟练掌握动态规划状态压缩DP乍一看可以Dijkstra,实际上的确可以Dijkstra.不过多了一个预交费的c,所以在遍历的时候多了一维状态,这个维度储存当前走过的城市集合.在Dijkstra的时候,如果走过了c那么就有两个选择,选其中最省的即可:否则没得选.#include <iostream> #include&nb.

POJ 2836 Rectangular Covering 题解 《挑战程序设计竞赛》

POJ 2836 Rectangular Covering铺地板:坐标平面上有n各点,用任意大小(非零)的地板砖覆盖它们,求最省的地板砖总面积.3.4熟练掌握动态规划状态压缩DP先预处理数据,将n个点两两组合形成n * (n-1) / 2个矩形,计算每个矩形的面积和内部点个数.接着利用预处理数据来枚举,定义dp[S] := 矩形集为S时的最省面积先假设平面上没有矩形,那么dp[0]=0,接着一个一个地往平面上加矩形,递推关系是:dp[新矩形集合] = min(dp[新矩形集合], dp[旧矩形集

POJ 2718 Smallest Difference(贪心 or next_permutation暴力枚举)

Smallest Difference Description Given a number of distinct decimal digits, you can form one integer by choosing a non-empty subset of these digits and writing them in some order. The remaining digits can be written down in some order to form a second

穷竭搜索: POJ 2718 Smallest Difference

题目:http://poj.org/problem?id=2718 题意: 就是输入N组数据,一组数据为,类似 [1  4  5  6  8  9]这样在0~9之间升序输入的数据,然后从这些数据中切一刀,比如  n1:[1 4 5],n2:[6 8 9]这样,然后 abs(n1- n2),对n1 和 n2的所有可能的排列 n1: [1 4 5][1 5 4]...这样,要算出来的最小的差,显然从中间切一刀才会出现这种解. 题解: 这里可以用来练习 STL,算法不会也没有关系,可以在这题学到 bi

poj 2718 Smallest Difference(穷竭搜索dfs)

Description Given a number of distinct decimal digits, you can form one integer by choosing a non-empty subset of these digits and writing them in some order. The remaining digits can be written down in some order to form a second integer. Unless the

(暴力+深搜)POJ - 2718 Smallest Difference

原题链接: http://poj.org/problem?id=2718 题意: 给你几个数字,可以分成两个子集,然后分别按一定顺序排列组成一个数,求出这两只值差的绝对值的最小值. 分析: 反正也是刷着玩,果断先交一波全排列枚举的代码,果断TLE,然后开始想正解. 稍微想想,既然要差最小,肯定是两个数各一半.所以只要深搜出所有n/2(n为给定数字的个数)的组合,另外个n-n/2个数就有了. 但是枚举出来后的操作又想了很久,想过很多算法,都不怎么满意,最终用二分解决. 先把n/2和n-n/2全排列

poj 2718 Smallest Difference

题目大意:给你几个数字,选出一些数字组成一个整数,另外的组成另一个整数,求这两个数差的绝对值的最小值 Input The first line of input contains the number of cases to follow. For each case, there is one line of input containing at least two but no more than 10 decimal digits. (The decimal digits are 0,

POJ 2718 Smallest Difference (穷竭搜索)

http://poj.org/problem?id=2718 将一个数切一刀拆成两个数,两个数每一位数字的顺序都可改变,但是不能有前导0.求这两个数之差的最小值. 我使用了搜索并且避免了递归,自认为是比较好的算法. 一开始我想到的是枚举,并且很快给出了实现: #ifndef ONLINE_JUDGE #pragma warning(disable : 4996) #endif #include <iostream> #include <string> #include <al