Task Scheduler
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6887
图片说明
公式推导跟着网上找的题解走了一遍,证明这一块还是有点懵,数学推导对于我来说太难了,最近看数论看得头都要秃了。。。。

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int n,m,k;
struct node{
    int id,t;
}a[N];
bool cmp(node a,node b){
    if(a.t==b.t)    return a.id<b.id;
    return a.t>b.t;
}
int main(){
    int T;
    cin>>T;
    for(int cs=1;cs<=T;cs++){
        cin>>n>>m>>k;
        for(int i=1;i<=n;i++){
            cin>>a[i].t;
            a[i].id=i;
        }
        if(k==0)
            for(int i=1;i<=n;i++)    cout<<i<<(i==n?"\n":" ");
        else{
            sort(a+1,a+1+n,cmp);
            for(int i=1;i<=n;i++)    cout<<a[i].id<<(i==n?"\n":" ");
        }
    }
    return 0;
}

Mine Sweeper
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6879
题目大意:扫雷,一个数字代表周围一圈里有多少个雷。
给出一个数N,代表所有数字的和。
让构造一个所有数字和是N的棋盘。
(雷的地方没有数字)
要求大小行、列都小于等于25
————————————————————————————————————————————————
x代表炸弹.代表没有炸弹
n是1的情况:X.
n是2的情况:X.X
n是3的情况:X.X.
一次类推,可以得到n小于等于24的情况。(因为这个只是一行)
在一个九个格子的中间放一个,可以贡献8,
还有在右下角放一个贡献3,
所以可以把25以后的变成8x + 3y的形式。(y < 8)

#include<algorithm>
#include<iostream>
using namespace std;
char a[50][50];
int main(){
    int T,n;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        if(n<=24){
            printf("1 %d\n",(n+1)/2*2+(n%2==0));
            for(int i=1;i<=(n+1)/2;i++)        printf("X.");
            if(n%2==0)    printf("X");
            printf("\n");
            continue;
        }
        for(int i=1;i<=25;i++)
            for(int j=1;j<=25;j++)    a[i][j] = '.';
        int k=0;
        for(;k<=8;k++)    
            if((n-3*k)%8==0)    break;
        int s=(n-3*k)/8;
        for(int i=2;i<=24;i+=2){
            if(s==0)    break;
            for(int j=2;j<=24;j+=2){
                if(s==0)    break;
                a[i][j]='X';
                s--;
            }
        }
        printf("%d %d\n",25,25);
        for(int i=25;k>0&&i>=1;i--,k--)        a[25][i] = 'X';
        for(int i=1;i<=25;i++)        printf("%s\n",a[i] + 1);
    }
}