CSU 1843: Jumping monkey 1846: Assembly line 1848: 3-sided dice 1849: Comparing answers

1843: Jumping monkey

#include<iostream>
#include<string.h>
#include<map>
#include<queue>
using namespace std;
deque<int> que,ans;

int num[1<<21],fa[1<<21];
int n,m,nxt[21];
bool v[1<<21];

int main()
{
    while(~scanf("%d%d",&n,&m) && n)
    {
        bool flag=0; int l=1<<n;
        for(int i=0;i<l;i++) v[i]=fa[i]=0;
        memset(nxt,0,sizeof(nxt));
        for(int i=1;i<=m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            nxt[u]|=(1<<v);
            nxt[v]|=(1<<u);
        }
        if (m>n-1)
        {
            puts("Impossible");
            continue;
        }
        v[(1<<n)-1]=1;
        que.clear();
        que.push_back((1<<n)-1);
        while (!que.empty() && !flag)
        {
            int cur=que.front();
            que.pop_front();
            for(int i=0;i<n;i++)
            {
                int next=0;
                if (cur&(1<<i))
                {
                    for(int j=0;j<n;j++)
                        if ((cur&(1<<j)) && j!=i) next|=nxt[j];
                    if (!v[next])
                    {
                        v[next]=1;
                        num[next]=i;
                        fa[next]=cur;
                        que.push_back(next);
                        if (!next) {flag=1;break;}
                    }
                }
            }
        }
        if (flag)
        {
            ans.clear();
            for(int cur=0;fa[cur];cur=fa[cur])
                ans.push_back(num[cur]);
            printf("%d: ",ans.size());
            for(int i=ans.size()-1;i>=0;i--)
                printf("%d%c",ans[i],!i? '\n':' ');
        } else puts("Impossible");
    }
    return 0;
}

1846: Assembly line

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
int cost[128][128],sz,dp[210][210][26],n,m,len;
char sym[26],ch[128][128],str[210];
bool first;

int main(){
    ios_base::sync_with_stdio(false);
    while(cin>>n&&n){
        if(first)
            cout<<endl;
        else
            first=true;

        for(int i=0;i<n;++i)
            cin>>sym[i];
        for(int i=0;i<n;++i)
        for(int j=0;j<n;++j)
            cin>>cost[sym[i]][sym[j]]>>ch[sym[i]][sym[j]]>>ch[sym[i]][sym[j]];

        cin>>m;
        while(m--){
            memset(dp,-1,sizeof dp);
            cin>>str;
            len=strlen(str);
            for(int i=0;i<len;++i)
                dp[i][i][str[i]]=0;
            for(int length=2;length<=len;++length)
            for(int i=0,j=length-1;j<len;++i,++j)
            for(int k=i;k<j;++k)
            for(int le=0;le<n;++le)
            if(dp[i][k][sym[le]]!=-1)
            for(int ri=0;ri<n;++ri)
            if(dp[k+1][j][sym[ri]]!=-1)
            if(dp[i][j][ch[sym[le]][sym[ri]]]==-1||dp[i][j][ch[sym[le]][sym[ri]]]>dp[i][k][sym[le]]+dp[k+1][j][sym[ri]]+cost[sym[le]][sym[ri]])
                dp[i][j][ch[sym[le]][sym[ri]]]=dp[i][k][sym[le]]+dp[k+1][j][sym[ri]]+cost[sym[le]][sym[ri]];

            int ans=-1;
            for(int i=0;i<n;++i)
            if(dp[0][len-1][sym[i]]!=-1)
                ans=(ans==-1?i:(dp[0][len-1][sym[i]]<dp[0][len-1][sym[ans]]?i:ans));
            cout<<dp[0][len-1][sym[ans]]<<'-'<<sym[ans]<<endl;

        }
    }
    return 0;
}

1848: 3-sided dice

#include<cstdio>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
using namespace std;
struct node{
    int x,y,z;
    node(){}
    node(int X,int Y,int Z){x=X;y=Y;z=Z;}
    bool operator==(const node P)const{
        return x==P.x&&y==P.y&&z==P.z;
    }
}p[5];
int Cross(int i,int j,int k){
    node v1(p[i].x-p[k].x,p[i].y-p[k].y,p[i].z-p[k].z),v2(p[j].x-p[k].x,p[j].y-p[k].y,p[j].z-p[k].z);
    return (v1.y*v2.z-v1.z*v2.y)+(v1.z*v2.x-v1.x*v2.z)+(v1.x*v2.y-v1.y*v2.x);
}
bool check(int i,int j,int k){
    node v1(p[k].x-p[i].x,p[k].y-p[i].y,p[k].z-p[i].z),v2(p[k].x-p[j].x,p[k].y-p[j].y,p[k].z-p[j].z);
    //向量每项必须符号相反(有一个为0,另一个也必须是0),否则两向量不相反
    if((v1.x==0&&v2.x!=0)||(v1.x!=0&&v2.x==0)) return 0;
    if((v1.y==0&&v2.y!=0)||(v1.y!=0&&v2.y==0)) return 0;
    if((v1.z==0&&v2.z!=0)||(v1.z!=0&&v2.z==0)) return 0;
    if(v1.x*v2.x>0||v1.y*v2.y>0||v1.z*v2.z>0) return 0;
    //如果A=α*B(α<0),那么A与B共线且方向相反
    if(v1.x==0&&v1.y==0&&v1.z==0) return 0;
    if(v1.x!=0&&v1.y!=0&&v1.x*v2.y!=v1.y*v2.x) return 0;
    if(v1.x!=0&&v1.z!=0&&v1.x*v2.z!=v1.z*v2.x) return 0;
    if(v1.y!=0&&v1.z!=0&&v1.y*v2.z!=v1.z*v2.y) return 0;
    return 1;
}
int main(){
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d%d",&p[0].x,&p[0].y,&p[0].z),p[0].x||p[0].y||p[0].z){
        for(int i=1;i<4;i++) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
        if(p[0]==p[1]&&p[1]==p[2]) {  //3个向量相等
            printf("%s\n",p[3]==p[0]?"YES":"NO");
            continue;
        }
        int area=abs(Cross(0,1,2));
        if(area==0){   //3条向量共面
            if(p[0]==p[1]||p[0]==p[2]||p[1]==p[2]) {
                bool flag;
                if(p[0]==p[1]) flag=check(0,2,3);
                else if(p[0]==p[2]) flag=check(0,1,3);
                else flag=check(1,2,3);
                printf("%s\n",flag?"YES":"NO");
            }
            else printf("%s\n",(check(0,1,3)||check(0,2,3)||check(1,2,3))?"YES":"NO");
        }
        else{
            //第四个点必须在三角形内
            //每个向量的可能性必须大于0,3个小三角形面积必须大于0且等于总面积
            int area1=abs(Cross(0,1,3));
            int area2=abs(Cross(0,2,3));
            int area3=abs(Cross(1,2,3));
            if(area1>0&&area2>0&&area3>0&&area==area1+area2+area3) printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}

1849: Comparing answers

#include <cstdio>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
using ll = long long;
const int maxn = 1e3 + 9;
typedef vector<ll> vec;
typedef vector<vec> mat;
ll n, M = 1e9;
vec mul(mat &A, vec &B)
{
	vec C(A.size());
	for (int i = 0; i<A.size(); i++)
	for (int j = 0; j<B.size(); j++){
		C[i] = (C[i] + A[i][j] * B[j]);
	}
	return C;
}
int main()
{
	while (cin >> n){
		if (n == 0)break;
		mat A(n, vec(n)), B(n, vec(n));
		for (int i = 0; i<n; i++)
		for (int j = 0; j<n; j++)
			cin >> A[i][j];
		for (int i = 0; i<n; i++)
		for (int j = 0; j<n; j++)
			cin >> B[i][j];
		vec H(n), TE(n);
		for (int i = 0; i<n; i++){
			H[i] = i + 1;
			TE[i] = i + 1;
		}
		H = mul(A, H);
		H = mul(A, H);
		TE = mul(B, TE);
		int f = 1;
		for (int i = 0; i<n; i++){
			if (TE[i] != H[i])
				f = 0;
		}
		if (f)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/80314351