6879-Mine Sweeper
题目链接
题意与分析
就是类似扫雷的一个游戏,一个大的矩形中每个方格有雷的位置用‘X’标记,没雷的位置用’.'标记,同时没雷的位置可以代表一个数字(0-8),数字大小满足扫雷的规则
要求给定一个数字n,为大矩形中每个方格中数字的和,如果能有一个满足要求的矩形图案则输出行列数和矩形图案,否则输出-1。
要求行列数都小于等于25。
代码(AC)
#include<bits/stdc++.h>
using namespace std;
const int N = 5005;
char grid[30][30];
int main() {
int n,t;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i = 0; i < 26;i++)
fill(grid[i],grid[i]+30,'X');
int r = 0, c = 0;
if(n <= 24) {
c = n + 1;
r = 1;
for(int i = 0; i < c; i += 2)
grid[0][i] = '.';
printf("%d %d\n",r,c);
for(int i = 0; i < c; i++)
cout<<grid[0][i];
cout<<endl;
}
else {
int n1, n2;
for(int i = 0; i <= 8; i++) {
if((n - i*3) % 8 == 0) {
n1 = (n - i*3)/8;
n2 = i;
r = (n1 + 11) / 12 ;
if(n1 % 12)
c = n1 % 12 * 2 + 1;
else
c = 25;
break;
}
}
for(int i = 1; i < 2*r-1; i += 2) {
for(int j = 1; j < 25; j += 2) {
grid[i][j] = '.';
}
}
for(int j = 1; j < c ; j += 2)
grid[2*r-1][j] = '.';
for(int i = 24; i > 24-n2; i--)
grid[24][i] = '.';
printf("%d %d\n",25,25);
for(int i = 0; i < 25; i++) {
for(int j = 0; j < 25; j++)
cout<<grid[i][j];
cout<<endl;
}
}
}
return 0;
}
6887-Task Scheduler
题目链接
题意与分析
这道题是一道概率分析题目,也就是数学方面的问题,给定每个任务需要的服务器数量,和总服务器坏服务器数量,是不放回的取出,求执行任务的顺序使得每次选到坏服务器重新选择这种冲突数量的最少。
代码(AC)
#include<bits/stdc++.h>
using namespace std;
vector<pair<int, int> >p;
//记住不要忘了按字典序输出呀,因为有所需服务器数量大小相同的任务!
bool cmp(pair<int,int> a, pair<int,int> b) {
if(a.second == b.second) return a.first < b.first;
else return a.second > b.second;
}
int main() {
//freopen("./1.in","r",stdin);
int t,n,m,k;
scanf("%d",&t);
while(t--) {
p.clear();
scanf("%d %d %d",&n, &m, &k);
for(int i = 0; i < n; i++) {
int temp;
scanf("%d",&temp);
p.push_back(make_pair(i+1, temp));
}
sort(p.begin(), p.end(), cmp);
if( !k ) {
for(int i = 1; i < n; i++)
cout<<i<<" ";
cout<<n<<endl;
}
else {
for(int i = 0; i < n-1; i++)
cout<<p[i].first<<" ";
cout<<p[n-1].first<<endl;
}
}
return 0;
}