HDU1050

题目链接

传送门

题目大意

题目大意就是在一个狭长的走廊里搬桌子,每次把桌子从一个房间搬到另一个房间,要求每次路径不能重叠 (可以同时搬路径不重叠的桌子),问至少需要多少时间能够搬完。

解题思路

贪心区间覆盖问题,算出每一段走廊走的次数,然后取最大值,因为每次搬消耗10分钟,所以最大值*10即为所求。

参考代码

#include <iostream>//数据输入输出流  
#include <string.h>//字符串操作函数  
#include <stdio.h>//C的输入输出  
#include <stdlib.h>//定义杂项函数及内存分配函数  
#include <math.h>//C中的数学函数  
#include <string.h>//c++中的string类 他不能用strcpy等c函数去操作  
#include <vector>//STL vetor容器  
#include <list>//STL list  
#include <map>// STL map  
#include <queue>// STL queue  
#include <stack>//sTL stack  
#include <bitset>//bitset可按位定义串  
//比如:bitset <1000> all;定义一个1000位的串  
#include <algorithm>//STL各种算法 比如 swap sort merge max min 比较  
#include <numeric>//常用数字操作 一般和algorithm搭配使用  
#include <functional>//STL定义运算函数(代替运算符)  
#include <limits.h>//定义各种数据类型最值常量  
using namespace std;  

int a[1000001];  

int main()  
{  
    #ifndef ONLINE_JUDGE  
    freopen("in.txt","r",stdin);  
    #endif  
    int T;  
    scanf("%d",&T);  
    while(T--)  
    {  
        memset(a , 0 , sizeof(a));  
        int n;  
        scanf("%d",&n);  
        while(n--)  
        {  
            int s , t;  
            scanf("%d%d",&s,&t);  
            s = (s - 1) / 2;  
            t = (t - 1) / 2;  
            int k;  
            if(s > t)  
            {  
                k = s;  
                s = t;  
                t = k;  
            }   
            for(int i = s ; i <= t ; i ++)  
                a[i] ++;  
        }  
        int maxx = -999999;  
        for(int i = 1; i <= 200 ; i ++)  
            if(a[i] > maxx)  
                maxx = a[i];  
        printf("%d\n",maxx * 10);     
    }  
}  

HDU1406

题目链接

传送门

解题思路

暴力枚举·····不过注意题中没给a和b的大小,所以要保证a < b,输入之后如果a > b则做交换

参考代码

#include <functional>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <numeric>  
#include <cstring>  
#include <climits>  
#include <cassert>  
#include <complex>  
#include <cstdio>  
#include <string>  
#include <vector>  
#include <bitset>  
#include <queue>  
#include <stack>  
#include <cmath>  
#include <ctime>  
#include <list>  
#include <set>  
#include <map>  

using namespace std;  

typedef long long LL;  
typedef double DB;  
typedef unsigned uint;  
typedef unsigned long long uLL;  

/** Constant List .. **/ //{  

const int MOD = int(1e9)+7;  
const int INF = 0x3f3f3f3f;  
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;  
const DB EPS = 1e-9;  
const DB OO = 1e20;  
const DB PI = acos(-1.0); //M_PI;  

bool check(int key)  
{  
    int sum = 1;  
    for(int i = 2 ; i < key ; i ++)  
    {  
        if(key % i == 0)  
            sum += i;  
    }  
    if(sum == key)  
        return true;  
    else  
        return false;  
}  

int main()  
{  
    #ifdef ZH  
    freopen("in.txt","r",stdin);  
    #endif  
    int T;  
    scanf("%d",&T);  
    while(T--)  
    {  
        int a , b;  
        scanf("%d%d",&a,&b);  
        int t;  
        if(a > b)  
        {  
            t = a;  
            a = b;  
            b = t;  
        }  
        int cnt = 0;  
        for(int i = a ; i <= b ; i ++)  
        {  
            if(check(i))  
                cnt ++;  
        }  
        printf("%d\n",cnt);  
    }  
}  

HDU1405

题目链接

传送门

解题思路

注意格式,每行最后都留一个空格

参考代码

#include <functional>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <numeric>  
#include <cstring>  
#include <climits>  
#include <cassert>  
#include <complex>  
#include <cstdio>  
#include <string>  
#include <vector>  
#include <bitset>  
#include <queue>  
#include <stack>  
#include <cmath>  
#include <ctime>  
#include <list>  
#include <set>  
#include <map>  
using namespace std;  

#pragma comment(linker, "/STACK:102400000,102400000")  

typedef long long LL;  
typedef double DB;  
typedef unsigned uint;  
typedef unsigned long long uLL;  

/** Constant List .. **/ //{  

const int MOD = int(1e9)+7;  
const int INF = 0x3f3f3f3f;  
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;  
const DB EPS = 1e-9;  
const DB OO = 1e20;  
const DB PI = acos(-1.0); //M_PI;  
const int maxn = 1000001;  
bool ispri[maxn];  
int pri[maxn];  
int t;  
void dopri()  
{  
    memset(ispri , true , sizeof(ispri));  
    t = 0;  
    for(int i = 2; i <= maxn ; i ++)  
    {  
        if(ispri[i])  
        {  
            pri[t ++] = i;  
            for(int j = i * 2 ; j <= maxn ; j += i)  
                ispri[j] = false;  
        }  
    }  
}  

int main()  
{  
    #ifdef DoubleQ  
    freopen("in.txt","r",stdin);  
    #endif  
    int n;  
    dopri();  
    int cas = 1;  
    while(~scanf("%d",&n) && n > 1)  
    {  
        if(cas != 1)  
            cout << endl;  
        printf("Case %d.\n",cas++);  
        int num = n;  
        for(int i = 0 ;  i < num ; i ++)  
        {  
            if( n == 1)  
                break;  
            int  cnt = 0;  
            while(n % pri[i] == 0)  
            {  
                cnt ++ ;  
                n /= pri[i];  
            }  
            if(cnt != 0)  
            {  
                printf("%d ",pri[i]);  
                printf("%d ",cnt);  
            }  
        }  
        printf("\n");  
    }  
}  

HDU1397

题目链接

传送门

题目大意

题目大意就是给你一个n,把n拆成两个素数和形式。问有几个这样的素数集合。

解题思路

先打个素数表,然后开始遍历素数表,为防止集合发生重复(例如(a,b)、(b,a)这种情况),所以
循环到n/2(包含n/2),当其中一个素数确定后,只要判断另一个数是不是素数就好了·····这时候可以
直接使用打表时用到的ispri数组来直接判断(不然用朴素判断会超时)

参考代码

#include <functional>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <numeric>  
#include <cstring>  
#include <climits>  
#include <cassert>  
#include <complex>  
#include <cstdio>  
#include <string>  
#include <vector>  
#include <bitset>  
#include <queue>  
#include <stack>  
#include <cmath>  
#include <ctime>  
#include <list>  
#include <set>  
#include <map>  
using namespace std;  

#pragma comment(linker, "/STACK:102400000,102400000")  

typedef long long LL;  
typedef double DB;  
typedef unsigned uint;  
typedef unsigned long long uLL;  

/** Constant List .. **/ //{  

const int MOD = int(1e9)+7;  
const int INF = 0x3f3f3f3f;  
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;  
const DB EPS = 1e-9;  
const DB OO = 1e20;  
const DB PI = acos(-1.0); //M_PI;  
const int maxn = 100001;  
bool ispri[maxn];  
int pri[maxn];  
int t;  

void dopri()  
{  
    memset(ispri , true , sizeof(ispri));  
    ispri[0] = ispri[1] = false;  
    t = 0;  
    for(int i = 2; i <= maxn ; i ++)  
    {  
        if(ispri[i])  
        {  
            pri[t ++] = i;  
            for(int j = i * 2 ; j <= maxn ; j += i)  
                ispri[j] = false;  
        }  
    }  
}  

int main()  
{  
    #ifdef DoubleQ  
    freopen("in.txt","r",stdin);  
    #endif  
    int n;  
    dopri();  
    while(~scanf("%d",&n) && n)  
    {  
        int cnt = 0;  
        for(int i = 0 ; pri[i] <= n / 2 ; i ++)  
        {  
            int  k = n - pri[i];  
            if(ispri[k])  
                cnt ++;  
        }  
        printf("%d\n",cnt);  
    }  
}  

HDU1393

题目链接

传送门

题目大意

题目大意是说给你一个s和d,分别代表当前分针位置和coin,然后问你是否能让它指到0,能的话输出
最少需要的coin,不能的话输出Impossible。

解题思路

本题很坑的一个地方!!!它的s每次都是变化的······比如描述中说的s = 45 , d = 2,那么下一次
s = 90 ,在下一次s = 180(再不做减法的情况下)

参考代码

#include <functional>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <numeric>  
#include <cstring>  
#include <climits>  
#include <cassert>  
#include <complex>  
#include <cstdio>  
#include <string>  
#include <vector>  
#include <bitset>  
#include <queue>  
#include <stack>  
#include <cmath>  
#include <ctime>  
#include <list>  
#include <set>  
#include <map>  
using namespace std;  

#pragma comment(linker, "/STACK:102400000,102400000")  

typedef long long LL;  
typedef double DB;  
typedef unsigned uint;  
typedef unsigned long long uLL;  

/** Constant List .. **/ //{  

const int MOD = int(1e9)+7;  
const int INF = 0x3f3f3f3f;  
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;  
const DB EPS = 1e-9;  
const DB OO = 1e20;  
const DB PI = acos(-1.0); //M_PI;  

int main()  
{  
    #ifdef DoubleQ  
    freopen("in.txt","r",stdin);  
    #endif  
    int s , d;  
    while(~scanf("%d%d",&s,&d) && s && d)  
    {  
        int t = d;  
        int cnt = 0;  
        while(t--)  
        {  
            s += s * d;  
            cnt ++;  
            while(s >= 60)  
                s -= 60;  
            if(s == 0)  
                break;  
        }  
        if(s != 0)  
        {  
            printf("Impossible\n");  
            continue;  
        }  
        printf("%d\n",cnt);  
    }  
}  

HDU1391

题目链接

传送门

题目大意

题目大意就是给出点坐标,问该点是否存在,存在的话输出该点所代表的数字,不存在的话输出No Number。

解题思路

找规律····有值的点有个规律,要么是x == y ,要么是x – y == 2,不符合的话那么不存在该点·····
两种情况都是1、3、1、3、1、3这么有规律增长的,唯一不同的是他们的起始值。当x == y是,从0开始增长。
当x – y == 2 时,从2开始增长。

参考代码

#include <functional>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <numeric>  
#include <cstring>  
#include <climits>  
#include <cassert>  
#include <complex>  
#include <cstdio>  
#include <string>  
#include <vector>  
#include <bitset>  
#include <queue>  
#include <stack>  
#include <cmath>  
#include <ctime>  
#include <list>  
#include <set>  
#include <map>  
using namespace std;  

#pragma comment(linker, "/STACK:102400000,102400000")  

typedef long long LL;  
typedef double DB;  
typedef unsigned uint;  
typedef unsigned long long uLL;  

/** Constant List .. **/ //{  

const int MOD = int(1e9)+7;  
const int INF = 0x3f3f3f3f;  
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;  
const DB EPS = 1e-9;  
const DB OO = 1e20;  
const DB PI = acos(-1.0); //M_PI;  

int s[10000001];  

int main()  
{  
    #ifdef DoubleQ  
    freopen("in.txt","r",stdin);  
    #endif  
    int d;  
    scanf("%d",&d);  
    while(d--)  
    {  
        int x , y;  
        scanf("%d%d",&x , &y);  
        if( !(x == y || x - y == 2) )  
        {  
            printf("No Number\n");  
            continue;  
        }  
        int sum;  
        if(x == y)  
        {  
            sum = 0;  
            for(int i = 0 ; i < x ; i ++)  
            {  
                if(i % 2 == 0)  
                    sum += 1;  
                else  
                    sum += 3;  
            }  
        }  
        else  
        {  
            sum = 2;  
            for(int i = 0 ; i < y ; i ++)  
            {  
                if(i % 2 == 0)  
                    sum += 1;  
                else  
                    sum += 3;  
            }  
        }  
        printf("%d\n",sum);  
    }  
}  

HDU1390

题目链接

传送门

题目大意

题意是说把一个数转换成二进制,输出1的位置(下标从0开始算)。

解题思路

转个二进制,遍历一遍。

参考代码

#include <functional>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <numeric>  
#include <cstring>  
#include <climits>  
#include <cassert>  
#include <complex>  
#include <cstdio>  
#include <string>  
#include <vector>  
#include <bitset>  
#include <queue>  
#include <stack>  
#include <cmath>  
#include <ctime>  
#include <list>  
#include <set>  
#include <map>  
using namespace std;  

#pragma comment(linker, "/STACK:102400000,102400000")  

typedef long long LL;  
typedef double DB;  
typedef unsigned uint;  
typedef unsigned long long uLL;  

/** Constant List .. **/ //{  

const int MOD = int(1e9)+7;  
const int INF = 0x3f3f3f3f;  
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;  
const DB EPS = 1e-9;  
const DB OO = 1e20;  
const DB PI = acos(-1.0); //M_PI;  

int s[10000001];  

int main()  
{  
    #ifdef DoubleQ  
    freopen("in.txt","r",stdin);  
    #endif  
    int d;  
    scanf("%d",&d);  
    while(d--)  
    {  
        int n;  
        scanf("%d",&n);  
        int t = 0;  
        int k;  
        while(n != 0)  
        {  
            k = n % 2;  
            s[t ++] = k;  
            n /= 2;  
        }  
        for(int i = 0; i < t ; i ++)  
        {  
            if(s[i] == 1)  
                printf("%d%c", i , i == t - 1 ? '\n' : ' ');  
        }  
    }  
}  

HDU1339

题目链接

传送门

题目大意

题意就是给你n,输出满足式子n = o * 2 ^ p的o和p。

解题思路

刚开始暴力(明知道超时····),果然超了····然后看看式子····果断用数学构造····
构造出来后很简单,就是不断地把n除以2,除的次数就是p,最后知道不能除为止,此时的n就是o。

参考代码

#include <functional>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <numeric>  
#include <cstring>  
#include <climits>  
#include <cassert>  
#include <complex>  
#include <cstdio>  
#include <string>  
#include <vector>  
#include <bitset>  
#include <queue>  
#include <stack>  
#include <cmath>  
#include <ctime>  
#include <list>  
#include <set>  
#include <map>  
using namespace std;  

#pragma comment(linker, "/STACK:102400000,102400000")  

typedef long long LL;  
typedef double DB;  
typedef unsigned uint;  
typedef unsigned long long uLL;  

/** Constant List .. **/ //{  

const int MOD = int(1e9)+7;  
const int INF = 0x3f3f3f3f;  
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;  
const DB EPS = 1e-9;  
const DB OO = 1e20;  
const DB PI = acos(-1.0); //M_PI;  

int main()  
{  
    #ifdef DoubleQ  
    freopen("in.txt","r",stdin);  
    #endif  
    int d;  
    scanf("%d",&d);  
    while(d--)  
    {  
        int n;  
        scanf("%d",&n);  
        int cnt = 0;  
        while(n % 2 == 0)  
        {  
            n /= 2;  
            cnt ++;  
        }  
        printf("%d %d\n",n , cnt);  
    }  

}  

HDU1335

题目链接

传送门

题目大意

题目大意就是给你个字符串,然后进行m进制到n进制的转换,输出转换结果,结果如果是长度超过7位的字符串的话,输出ERROR。

解题思路

进制转换时注意10进制以上的特殊判断(涉及到字母),整数变字母减A加10,反之,字母变数字加A减10,。
最后注意下格式,考虑下结果前面有多少个空格输出(7-t,t为结果串的长度)

参考代码

#include <functional>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <numeric>  
#include <cstring>  
#include <climits>  
#include <cassert>  
#include <complex>  
#include <cstdio>  
#include <string>  
#include <vector>  
#include <bitset>  
#include <queue>  
#include <stack>  
#include <cmath>  
#include <ctime>  
#include <list>  
#include <set>  
#include <map>  
using namespace std;  

#pragma comment(linker, "/STACK:102400000,102400000")  

typedef long long LL;  
typedef double DB;  
typedef unsigned uint;  
typedef unsigned long long uLL;  

/** Constant List .. **/ //{  

const int MOD = int(1e9)+7;  
const int INF = 0x3f3f3f3f;  
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;  
const DB EPS = 1e-9;  
const DB OO = 1e20;  
const DB PI = acos(-1.0); //M_PI;  

string mnum , nnum , tmp;  
int m , n , t;  

void solve(string mnum , int m , int n)  
{  
    int len = mnum.length();  
    int res = 0;  
    for(int i = 0 ; i < len ; i ++)  
    {  
        res *= m;  
        if(mnum[i] >= '0' && mnum[i] <= '9')  
            res += mnum[i] - '0';  
        else if(mnum[i] >= 'A' && mnum[i] <= 'F')  
            res += mnum[i] - 'A' + 10;  
    }  
    t = 0;  
    int k;  
    while(res != 0)  
    {  
        k = res % n;  
        if(k >= 0 && k <= 9)  
            tmp[t ++] = k + '0';  
        else if(k > 9 && k <= 16)  
            tmp[t ++] = k + 'A' - 10;  
        res /= n;  
    }  
    if(t > 7)  
    {  
        printf("  ERROR\n");  
        return;  
    }  
    int s;  
    for(int i = 0 , j = t - 1 ; i < j ; i ++ , j --)  
    {  
        s = tmp[i];  
        tmp[i] = tmp[j];  
        tmp[j] = s;  
    }  
    for(int i = 0 ; i < 7 - t ; i++)  
        printf(" ");  
    for(int i = 0; i < t ; i ++)  
        printf("%c",tmp[i]);  
    printf("\n");  
}  


int main()  
{  
    #ifdef DoubleQ  
    freopen("in.txt","r",stdin);  
    #endif  
    while(cin >> mnum >> m >> n)  
    {  
        int i = 0;  
        while(mnum[i] == ' ')  
            i ++;  
        nnum = mnum.substr(i);  
        solve(nnum , m , n);  
    }  
}  

HDU1334

题目链接

传送门

题目大意

题目大意就是求出满足a * a * a == b * b * b + c * c * c + d * d * d,输出从6到200,满足条件的a、b、c、d的值。

解题思路

相当暴力·····不要怕超时就行······,另外a、b、c、d不相等哦·····

参考代码

#include <functional>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <numeric>  
#include <cstring>  
#include <climits>  
#include <cassert>  
#include <complex>  
#include <cstdio>  
#include <string>  
#include <vector>  
#include <bitset>  
#include <queue>  
#include <stack>  
#include <cmath>  
#include <ctime>  
#include <list>  
#include <set>  
#include <map>  
using namespace std;  

#pragma comment(linker, "/STACK:102400000,102400000")  

typedef long long LL;  
typedef double DB;  
typedef unsigned uint;  
typedef unsigned long long uLL;  

/** Constant List .. **/ //{  

const int MOD = int(1e9)+7;  
const int INF = 0x3f3f3f3f;  
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;  
const DB EPS = 1e-9;  
const DB OO = 1e20;  
const DB PI = acos(-1.0); //M_PI;  

int main()  
{  
    for(int a = 6 ; a <= 200 ; a ++)  
    {  
        for(int b = 2 ; b < a ; b ++)  
        {  
            for(int c = b + 1 ; c < a ; c ++)  
            {  
                for(int d = c + 1 ; d < a ; d ++)  
                {  
                    if( (a * a * a) == (b * b * b + c * c * c + d * d * d) )  
                    {  
                        printf("Cube = %d, Triple = (%d,%d,%d)\n",a,b,c,d);  
                    }  
                }  
            }  
        }  
    }  
}