CSU 1859: Gone Fishing 1861: Unscrambling Images 1862: The Same Game 1865: Triangle War

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

1861: Unscrambling Images

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

1862: The Same Game

#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()
{
    //down
    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;
                    }
                }
            }
        }
    }
    //left
    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;
}

1865: Triangle War

#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])
		{
//			cout<<"B:"<<map[x][y]<<endl;
			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;
}

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/80314576
今日推荐