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);
}
}
京公网安备 11010502036488号