A Winner
模拟
先找最大值,
然后看有几个能达到这个最大值的,记录下来
只有一个,就输出它
有多个,再重新扫一遍,
看这几个,谁先到达这个值
B Cinema Cashier
暴力(可以写成dp)
全部暴力,找最小
dp: 我们发现要反复扫这个矩阵,不难想要用对于每个 i–j --m 记录下来
dp[i][j][m]表示在i,从j放m个人 ,可以从m-1 转移过来
#include <algorithm>
#include <iostream>
#include <queue>
#include<map>
#include <set>
#include <stack>
#include <string>
#include <vector>
#include <cstring>
#include<cmath>
#include <cstdio>
#define ms(a,b) memset(a, b, sizeof a)
#define _for(i,a,b) for(int i=a;i<b;i++)
#define For(i, a, b) for (int i = a; i <= b; i++)
#define foR(i, b, a) for (int i = b; i >= a; i--)
#define sc1(a) scanf("%d", &a)
#define sc2(a,b) scanf("%d%d", &a,&b)
#define sc3(a,b,c) scanf("%d%d%d", &a,&b,&c)
#define PII pair<double,int>
using namespace std;
const int N = 100, INF = 0x3f3f3f3f;
int n,k;
bool g[N][N];
int Mid;
int con(int x,int y,int m){
int sum=0; For(j,y,y+m-1)sum+=abs(x-Mid)+abs(j-Mid);return sum;}
void ji(int x,int y,int m){
For(j,y,y+m-1)g[x][j]=1;}
bool pj(int x,int y,int m){
For(j,y,y+m-1)if(g[x][j])return 1;return 0;}
int x,yl,yr;
void find_(int m){
//1.遍历 ,判断,计算,找最小
x=yl=yr=-1;
int Min=INF;
For(i,1,k){
For(j,1,k-m+1){
if(pj(i,j,m))continue;
int sum=con(i,j,m);
if(sum<Min){
Min=sum;
x=i,yl=j,yr=j+m-1;
}
}
}
if(x!=-1)ji(x,yl,m);
}
int main(){
cin>>n>>k;
Mid=k/2+1;
_for(i,0,n){
int m;cin>>m;
find_(m); //找m放在哪最小
if(x!=-1){
printf("%d %d %d\n",x,yl,yr);
}
else cout<<-1<<endl;
}
}
C Hierarchy
稍微找找,就会发现,满足条件的情况,有n-1个入度为1的点
#include <algorithm>
#include <iostream>
#include <queue>
#include<map>
#include <set>
#include <stack></