zoukankan      html  css  js  c++  java
  • NOIP2012普及组

    T2】寻宝

     读懂题目!!

    是逆时针,第几个有钥匙的房间,还有能够直接上楼的是作为第一个有钥匙的房间,而不是就从这里直接上楼了

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<stack>
    #include<cstdio>
    #include<queue>
    #include<map>
    #include<vector>
    #include<set>
    using namespace std;
    const int maxn=1010;
    const int INF=0x3fffffff;
    int n,m;
    //发现了我的一个错误点,我以为房间是按照顺时针排的,数的时候是逆时针,所以数的时候是--。。。。。 
    //另外发现了,,,我的代码真的不简洁完美,还欠缺气候,,很多地方值得改进 
    struct node{
    	int num;
    	int flag;
    };
    node ve[10001][110];
    int isok[10010];
    
    int main(){
    	scanf("%d %d",&n,&m);
    	int f,x,fir;
    	for(int i=1;i<=n;i++){
    		for(int j=0;j<m;j++){
    			scanf("%d %d",&ve[i][j].flag,&ve[i][j].num);
    			if(ve[i][j].flag) isok[i]++;
    		}
    	}
    	scanf("%d",&fir);
    	
    	long long ans=ve[1][fir].num%20123;
    	//long long summ=ans;
    //	cout<<summ<<endl;
    //	int flagg=ve[1][fir].flag;
    	int la=1,nex,op;
    	while(1){
    		op=(ve[la][fir].num-1)%isok[la]+1; //还需要走的,直接模取,不然肯定超时呀(另外这种写法,,,呜呜呜呜不错 
    		int last=0;
    		while(last<op){
    			last+=ve[la][fir].flag;
    			if(last==op) break;
    			fir++;
    			if(fir==m) fir=0;  //注意 
    		}
    		la++; 
    		ans=(ans+ve[la][fir].num)%20123; 
    		if(la==n) break;
    	}
    	printf("%lld
    ",ans%20123);
    return 0;
    }
    

      

    T3】摆花

     一开始拿到手没什么思路

    结果其实就是DP

    注意这个三重循环,一开始初值是f[0][0]=1

    循环是:

    for(int i=1;i<=n;i++)

    for(int j=0;j<=m;j++)

    for(int k=0;k<=a[i];k++)

    if(j>=k)  注意这里

    f[i][j]=(f[i][j]+f[i-1][j-k])%mod

    #include<cstdio>
    int f[101][101],n,m,a[101];
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        f[0][0]=1;
        for(int i=1;i<=n;i++)
            for(int j=0;j<=m;j++)
                for(int k=0;k<=a[i];k++)
                    if(j>=k)
                        f[i][j]=(f[i][j]+f[i-1][j-k])%1000007;
        printf("%d",f[n][m]);
    }
    

      

    T4】文化之旅

     很简单,数据范围不大,floyd即可

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<stack>
    #include<cstdio>
    #include<queue>
    #include<map>
    #include<vector>
    #include<set>
    using namespace std;
    const int maxn=1010;
    const int INF=10000000;
    int n,k,m,s,t;
    //数据不大,可以用暴力
    int c[110][110]; 
    int ctr[110];
    int dis[110][110];
    int main(){
    	cin>>n>>k>>m>>s>>t;
    	for(int i=1;i<=n;i++){
    		cin>>ctr[i];
    	}
    	int x,y,diss;
    	for(int i=1;i<=k;i++){
    		for(int j=1;j<=k;j++){
    			cin>>c[i][j];
    		}
    	}
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=n;j++) {
    		dis[i][j]=INF;
    		if(i==j) dis[i][j]=0;
    	}
    	for(int i=1;i<=m;i++){
    			cin>>x>>y>>diss;
    		dis[x][y]=min(dis[x][y],diss);
    		dis[y][x]=min(dis[y][x],diss); //因为有多条路 
    		
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(c[ctr[i]][ctr[j]]) dis[j][i]=INF; //i仇视j的文化,那么从j不可能去i,但是i可以去j 
    		}
    	}
    	for(int k=1;k<=n;k++){ //之间的放外层 
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=n;j++){
    				//if(i!=j&&i!=k&&j!=k) 
    				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    			}
    		}
    	}
    	if(dis[s][t]>=INF) cout<<"-1"<<endl;
    	else cout<<dis[s][t]<<endl;
    return 0;
    }
    

      

  • 相关阅读:
    PHP基础知识系列:预定义变量
    PHP基础知识系列:拦截器方法
    【PHP设计模式】创建型之单例(Singleton)
    PHP基础知识系列:cookie与session
    select问题
    柳传志给杨元庆的信
    PHP基础知识系列:多态性
    PHP基础知识系列:面向对象基础
    PHP处理字符串翻转问题总结
    PHP基础知识系列:静态
  • 原文地址:https://www.cnblogs.com/shirlybaby/p/13626731.html
Copyright © 2011-2022 走看看