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); } }