您的位置:首页 > 产品设计 > UI/UE

UESTC 2016 Summer Training #10 Div.2(未完待续)

2016-07-21 19:25 357 查看
题目来源:2008-2009 ACM-ICPC East Central North America Regional Contest (ECNA 2008)

http://codeforces.com/gym/100646

D

题意:给你N场宴会的开始和结束时间,都是整点,在一个小时内,你最多只能参加2场宴会,问你最多能去到多少宴会。

两种方法:

1)比赛中我比较智障,是用二分图最大匹配做的。

宴会时间是8-24,每小时至多两场,那我就对应到16-48,每点对应一个宴会,最多100个点,能去就连边,跑一个二分图最大匹配

#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);

#define INF 0x3f3f3f3f
#define eps 1e-6
typedef long long LL;
const double pi = acos(-1.0);
const long long mod = 1e9 + 7;
using namespace std;

int q[105][105];
int used[105];
int girl[105];

struct data
{
int x,y;
}p[105];

bool cmp(const data a,const data b)
{
if(a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}

bool fun(int x)
{
for(int j = 16;j < 48;j++)
{
if(q[x][j] == 1 && used[j] == 0)
{
used[j] = 1;
if(girl[j] == -1 || fun(girl[j]))
{
girl[j] = x;
return 1;
}
}
}
return 0;
}

int main()
{
//ios_base::sync_with_stdio(false); cin.tie(0);
//freopen("int.txt","r",stdin);
//freopen("out.txt","w",stdout);
int N;
int cas = 1;
while(scanf("%d",&N) == 1 && N != 0)
{
int ans = 0;
for(int i = 0;i < N;i++)
scanf("%d %d",&p[i].x,&p[i].y);
sort(p,p + N,cmp);
memset(q,0,sizeof(q));
memset(girl,-1,sizeof(girl));
for(int i = 0;i < N;i++)
for(int j = 2 * p[i].x;j < 2 * p[i].y;j++)
q[i][j] = 1;
for(int i = 0;i < N;i++)
{
memset(used,0,sizeof(used));
if(fun(i))
ans++;
}
printf("On day %d Emma can attend as many as %d parties.\n",cas++,ans);
}
return 0;
}


还有一种方法就是贪心

对右端点排序,相同的话则把左端点大的放在前面,让受到限制最大的点先选就可以了,貌似大多数人都是这么做出来的(我就说怎么大家都会二分图,很强)

#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
#define eps 1e-6
typedef long long LL;
const double pi = acos(-1.0);
const long long mod = 1e9 + 7;

using namespace std;

struct data
{
int x,y;
}p[10005];

bool cmp(const data a,const data b)
{
if(a.y == b.y)
return a.x > b.x;
return a.y < b.y;
}

int vis[10005];

int main()
{
int N;
int cas = 1;
while(cin >> N)
{
if(N == 0)
break;
memset(vis,0,sizeof(vis));
for(int i = 0;i < N;i++)
{
scanf("%d %d",&p[i].x,&p[i].y);
p[i].x *= 2;
p[i].y *= 2;
}
sort(p,p + N,cmp);
int ans = 0;
memset(vis,0,sizeof(vis));
for(int i = 0;i < N;i++)
for(int j = p[i].x;j < p[i].y;j++)
if(!vis[j]){
vis[j] = 1;
ans++;
break;
}
printf("On day %d Emma can attend as many as %d parties.\n",cas++,ans);
}
return 0;
}


E

题意:就是数独游戏,给你一个9 * 9的格子,其中每个3 * 3的格子里都含有1—9共9个数,并且每行每列也都是含有1—9共9个数,每次给你一个这样的格子,有5个格子变成0,其他给你。问你能否把它恢复成一个正确的9 * 9的格子。

解法:由于只有5个格子位置,于是直接暴力枚举每个格子是1-9的情况,对于每种枚举,check一下是否合法,合法就直接输出即可。

#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);

#define INF 0x3f3f3f3f
#define eps 1e-6
typedef long long LL;
const double pi = acos(-1.0);
const long long mod = 1e9 + 7;
using namespace std;

char s[10][10];
int a[15];

struct data
{
int x,y;
}p[10];

int check()
{
for(int i = 0;i < 9;i++)
{
memset(a,0,sizeof(a));
for(int j = 0;j < 9;j++)
a[s[i][j] - '0']++;
for(int j = 1;j <= 9;j++)
if(a[j] == 0)
return 0;
}
for(int i = 0;i < 9;i++)
{
memset(a,0,sizeof(a));
for(int j = 0;j < 9;j++)
a[s[j][i] - '0']++;
for(int j = 1;j <= 9;j++)
if(a[j] == 0)
return 0;
}
for(int i = 0;i < 9;i += 3)
for(int j = 0;j < 9;j += 3)
{
memset(a,0,sizeof(a));
for(int k = 0;k < 3;k++)
for(int l = 0;l < 3;l++)
a[s[i + k][j + l] - '0']++;
for(int i = 1;i <= 9;i++)
if(a[i] == 0)
return 0;
}
return 1;
}

int main()
{
//ios_base::sync_with_stdio(false); cin.tie(0);
//freopen("int.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
cin >> T;
int first = 1;
while(T--)
{
int ok = 0;
int m = 0;
for(int i = 0;i < 9;i++)
scanf("%s",s[i]);
for(int i = 0;i < 9;i++)
for(int j = 0;j < 9;j++)
if(s[i][j] == '0'){
p[m].x = i;
p[m++].y = j;
}
int ansi = 0,ansj = 0,ansk = 0,ansl = 0,ansn = 0;
for(int i = 1;i < 10;i++)
for(int j = 1;j < 10;j++)
for(int k = 1;k < 10;k++)
for(int l = 1;l < 10;l++)
for(int n = 1;n < 10;n++){
s[p[0].x][p[0].y] = i + '0';
s[p[1].x][p[1].y] = j + '0';
s[p[2].x][p[2].y] = k + '0';
s[p[3].x][p[3].y] = l + '0';
s[p[4].x][p[4].y] = n + '0';
if(check() == 1)
{
ok = 1;
ansi = i;
ansj = j;
ansk = k;
ansl = l;
ansn = n;
}
}
s[p[0].x][p[0].y] = ansi + '0';
s[p[1].x][p[1].y] = ansj + '0';
s[p[2].x][p[2].y] = ansk + '0';
s[p[3].x][p[3].y] = ansl + '0';
s[p[4].x][p[4].y] = ansn + '0';
if(first)
first = 0;
else
puts("");
if(ok)
{
for(int i = 0;i < 9;i++)
printf("%s\n",s[i]);
}
else
puts("Could not complete this grid.");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: