zoukankan      html  css  js  c++  java
  • 洛谷P6022 快乐水

    无聊来写一写题解吧

    比赛的水题:模拟
    但是第十个数据是真的毒瘤

    题目传送门

    sol

    思路很简单,一开始小A有(n)瓶快乐水,商店有(m)个附属品(也就是有(m)种白嫖快乐水的方式),就枚举呗。

    枚举每一个附属品,未喝的加上它的权值整除初值,并用它的权值对初值取模。

    判断边界,其实也很简单,当每一个附属品的权值都小于初值,就可以退出了
    如果没有,就输出“Inf”,即可以无限白嫖快乐水

    code

    #include<cstdio>
    #define ull unsigned long long//防止爆,开了ull,开long long一样
    using namespace std;
    inline int read(){
    	int res=0,sign=1;char ch;
    	while((ch=getchar())<'0'||ch>'9')if(ch=='-')sign=-1;res=res*10+ch-48;
    	while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;
    	return res*sign;
    }//快读不解释
    const int maxn=6;
    int n,m;
    ull f[maxn];//初值
    ull num[maxn];//累计每一个附属品权值
    long long bu=0;//计算步数
    ull ans=0,weihe=0;//ans记录最多能喝的快乐水,weihe没喝的快乐水
    bool flag=true;//判断边界,是否可以无限白嫖
    int main(){
    	n=read(),m=read();
    	for(int i=1;i<=m;i++)f[i]=read();//读入
    	weihe=n;
    	ans+=weihe;//已喝n瓶
    	for(ull i=1;i<=m;i++)
    	 num[i]+=weihe;//累计加上
    	weihe=0;
    	while(true){
    		bu++;
    		flag=true;
    		for(ull i=1;i<=m;i++)
    		 num[i]+=weihe;
    		ans+=weihe;//每一步都要加上没喝的快乐水
    		weihe=0;
    		for(ull i=1;i<=m;i++){
    			if(num[i]>=f[i]){
    		 	  flag=false;
    		 	  break;
    		    }
    		    if(num[i]<f[i])continue;
    		}//判断边界,如果每一个附属品权值都小于初值,即退出
    		if(flag)break;
    	    for(int i=1;i<=m;i++){
    	    	weihe+=num[i]/f[i];
    	    	num[i]=num[i]%f[i];
    		}//未喝的加上它的权值整除初值,并用它的权值对初值取模
    		if(bu==50000000){puts("Inf");return 0;}//如果步数很大,就可以无限白嫖
    	} 
    	printf("%llu",ans);//输出最多能喝的快乐水
    	return 0;
    }
    

    完结撒花

  • 相关阅读:
    git stash回退
    基于git tag快速修复
    Go语言开发规范
    defer实现原理
    string数据结构
    关于const iota
    struct
    map数据结构底层详解
    go 函数进阶
    go 内存分配原理
  • 原文地址:https://www.cnblogs.com/qzwer/p/13168184.html
Copyright © 2011-2022 走看看