1859: Gone Fishing
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int maxn=25+5;
int n,toalltime;
int fishBone[maxn],cost[maxn],finalTime[maxn];
struct node
{
int fishes;
int id;
int theMinus;
node(int fishes=0,int id=0,int theMinus=0):fishes(fishes),id(id),theMinus(theMinus){};
bool operator <(const node& p) const
{
return fishes>p.fishes||(fishes==p.fishes&&id<p.id);
}
}t[maxn];
int main()
{
while(~scanf("%d",&n))
{
if(!n)
return 0;
int ans=-1;
scanf("%d",&toalltime);
toalltime*=60;
memset(fishBone,0,sizeof(fishBone));
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
t[i].id=i;
t[i].fishes=x;
}
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
t[i].theMinus=x;
}
for(int i=0;i<n-1;i++)
{
scanf("%d",&cost[i]);
}
int tmptime[maxn];
int tmpsum=0;
for(int i=0;i<n;i++)
{
int tmptoall=toalltime;
tmpsum=0;
memset(tmptime,0,sizeof(tmptime));
set<node>Q;
for(int j=i;j>=0;j--)
{
if(j-1>=0)
tmptoall-=(cost[j-1]*5);
Q.insert(t[j]);
}
while(tmptoall)
{
node first=*Q.begin();
Q.erase(Q.begin());
tmpsum+=first.fishes;
first.fishes-=first.theMinus;
if(first.fishes<0)
first.fishes=0;
Q.insert(first);
tmptime[first.id]+=5;
tmptoall-=5;
if(tmptoall<5)
tmptoall=0;
}
if(tmpsum>ans)
{
ans=tmpsum;
memcpy(fishBone,tmptime,sizeof(tmptime));
}
}
for(int i=0;i<n;i++)
{
printf("%d%s",fishBone[i],i==n-1?"\n":", ");
}
cout<<"Number of fish expected: "<<ans<<endl;
cout<<endl;
}
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <map>
using namespace std;
typedef pair<int,int> pa;
int arr[300],raw[20][20],board[20][20],n,k,kcase;
map<int,int> ma;
void create(int arr[][20],pa le=make_pair(1,1),int len=n,int node=0);
int main(){
ios_base::sync_with_stdio(false);
int times;
cin>>times;
while(times--){
cout<<"Case "<<++kcase<<endl<<endl;
cin>>n;
cin>>k;
for(int i=0,a,b;i<k;++i)
cin>>a>>b,ma.insert(make_pair(a,b));
create(raw);
ma.clear();
cin>>k;
for(int i=0,a,b;i<k;++i)
cin>>a>>b,ma.insert(make_pair(a,b));
create(board);
ma.clear();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
arr[raw[i][j]]=board[i][j];
for(int i=1,tmp=0;i<=n;++i){
for(int j=1;j<=n;++j)
cout<<setw(4)<<arr[tmp++];
cout<<endl;
}
cout<<endl;
}
return 0;
}
void create(int arr[][20],pa le,int len,int node){
if(ma.find(node)!=ma.end()){
int tmp=ma[node];
for(int i=0;i<len;++i)
for(int j=0;j<len;++j)
arr[le.first+i][le.second+j]=tmp;
}else{
create(arr,le,(len>>1),(node<<2)+1);
create(arr,make_pair(le.first+(len>>1),le.second),(len>>1),(node<<2)+2);
create(arr,make_pair(le.first,(le.second)+(len>>1)),(len>>1),(node<<2)+3);
create(arr,make_pair(le.first+(len>>1),le.second+(len>>1)),(len>>1),(node<<2)+4);
}
}
#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int maxn= 30 +9;
string s[maxn];
int n=10,m=15,vis[maxn][maxn];
struct pn
{
int x,y;
};
void dfs(int x,int y,char c,int& t)
{
if(x<0||x>=n||y<0||y>=m||vis[x][y]) return;
if(s[x][y]!=c) return;
t++;
vis[x][y]=1;
for(int i=-1;i<2;i++){
for(int j=-1;j<2;j++) if(!i^!j){
dfs(x+i,y+j,c,t);
}
}
}
void dfs2(int x,int y,char c)
{
if(x<0||x>=n||y<0||y>=m||vis[x][y]) return;
if(s[x][y]!=c) return;
s[x][y]='.';
vis[x][y]=1;
for(int i=-1;i<2;i++){
for(int j=-1;j<2;j++) if(!i^!j){
dfs2(x+i,y+j,c);
}
}
}
int K;
vector<int> vi;
bool allem(int y)
{
for(int i=0;i<n;i++){
if(s[i][y]!='.')
return false;
}
return true;
}
void smove()
{
for(int j=0;j<m;j++){
for(int i=n-1;i>=0;i--){
if(s[i][j]=='.'){
for(int k=i;k>=0;k--){
if(s[k][j]!='.'){
swap(s[i][j],s[k][j]);
break;
}
}
}
}
}
for(int j=0;j<m;j++){
if(allem(j)){
for(int k=j;k<m;k++){
if(!allem(k)){
for(int i=0;i<n;i++)
swap(s[i][j],s[i][k]);
break;
}
}
}
}
}
int okw()
{
int ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(s[i][j]!='.')
ans++;
}
return ans;
}
int main()
{
int T; cin>>T;
while(T--){
ll fin=0;
for(int i=0;i<n;i++){
cin>>s[i];
}
printf("Game %d:\n\n",++K);
int KK=0;
for(;1;){
vi.clear();
memset(vis,0,sizeof(vis));
int num=0,J=0;
pn p;
char CC;
for(int j=0;j<m;j++)
for(int i=n-1;i>=0;i--) if(!vis[i][j]&&s[i][j]!='.'){
int t=0;
dfs(i,j,s[i][j],t);
J++;
if(t<=1) continue;
vi.push_back(t);
if(t>num){
CC=s[i][j];
p.x=i,p.y=j;
num=t;
}
else if(t==num){
if(j<p.y&&i>p.x){
CC=s[i][j];
p.x=i,p.y=j;
}
}
}
memset(vis,0,sizeof(vis));
if(vi.empty()||okw()==0){
break;
}
dfs2(p.x,p.y,CC);
printf("Move %d at (%d,%d): removed %d balls of color %c, got %lld points.\n",++KK,n-p.x,p.y+1,num,CC,(ll)(num-2)*(num-2));
fin+=(ll)(num-2)*(num-2);
smove();
}
if(!okw()){
fin+=1000;
}
printf("Final score: %lld, with %d balls remaining.\n",fin,okw());
if(K!=n) puts("");
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<bitset>
#define LL long long
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define down(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline LL read()
{
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
#define N 18
#define MIN -10
int tri[9]={7,52,152,352,3200,12544,34304,71680,155648};
int m=(1<<18)-1;
int map[11][11]={0};
int pri[4][2]={1,0,0,1,-1,0,0,-1};
int f[(1<<19)+5];
int n;
void getmap()
{
memset(map,0,sizeof(map));
map[1][2]=1;map[1][3]=2;
map[2][3]=3;map[2][4]=4;map[2][5]=5;
map[3][5]=6;map[3][6]=7;
map[4][5]=8;map[4][7]=10;map[4][8]=11;
map[5][6]=9;map[5][8]=12;map[5][9]=13;
map[6][9]=14;map[6][10]=15;
map[7][8]=16;
map[8][9]=17;
map[9][10]=18;
fo(i,1,9)
fo(j,i+1,10)
if(map[i][j])
map[j][i]=map[i][j];
}
int getvalue(int old,int now)
{
int ret=0;
fo(i,0,8)
if((old&tri[i])!=tri[i]&&(now&tri[i])==tri[i])
ret++;
return ret;
}
int calc(int now)
{
if(f[now]!=MIN)return f[now];
int cnt=getvalue(0,now),ma=MIN;
bitset<20>t;t=now;
fo(i,0,17)
if(t[i]==0)
{
t[i]=1;
int ne=t.to_ulong();
int val=getvalue(now,ne);
if(val>0)val+=calc(ne);
else val+=-1*calc(ne);
ma=max(ma,val);
t[i]=0;
}
return f[now]=ma;
}
void solve(int ch)
{
n=read();
int player=1,cnt=0;
bitset<20>t;t.reset();
fo(i,1,n)
{
int x=read(),y=read();
int k=0;
if(map[x][y])
{
unsigned long old=t.to_ulong();
t[map[x][y]-1]=1;
unsigned long now=t.to_ulong();
k=getvalue(old,now);
}
if(k)cnt+=player*k;
else player*=-1;
}
unsigned long now=t.to_ulong();
cnt+=player*calc(now);
if(cnt>0)printf("Game %d: A wins.\n",ch);
else printf("Game %d: B wins.\n",ch);
}
int main()
{
getmap();
fill(f,f+(1<<19),-10);
f[m]=0;
int ttttt=read();
fo(i,1,ttttt)solve(i);
return 0;
}