• 2019-3-31义乌中学比赛题解


    比赛

    题目还是比较简单的,T3 T4都没要求输出步骤

    T1 [CF6C]Alice, Bob and Chocolate

    题目传送门

    一开始看到这题总想写个多线程,但肯定是行不通的。(比赛时还写得十分复杂,不过竟然可以过诶)不能同时执行两个人,那么就交替着执行。

    注意:处理好两个人在吃同一块巧克力的情况

    看代码吧:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=100000+10;
    int t[N];
    int n,cnta,cntb;
    inline int read()
    {
    	int tot=0;
    	char c=getchar();
    	while(c<'0'||c>'9')
    	{
    		c=getchar();
    	}
    	while(c>='0'&&c<='9')
    	{
    		tot=(tot<<1)+(tot<<3)+c-'0';
    		c=getchar();
    	}
    	return tot;
    }
    int main()
    {
    	n=read();
    	for(int i=1;i<=n;i++)
    	{
    		t[i]=read();
    	}
    	int pa=1,pb=n;
    	while(pa<=pb)
    	{
    		//cout<<pa<<" "<<pb<<" "<<cnta<<" "<<cntb<<endl;
    		if(cnta<=cntb)cnta+=t[pa++];
    		else cntb+=t[pb--];
    		//system("pause");
    	}
    	//cout<<cnta<<" "<<cntb<<endl;
    	cout<<pa-1<<" "<<n-pb<<endl;//输出需处理好
    	return 0;
    }
    

    T2 [CF910C] Minimum Sum

    题目传送门

    当时看到这题一脸懵逼,莫名想到了复杂度为O(10000000000*n)的算法,然而肯定会超时(废话)

    接着想到了贪心。

    很明显这题是要用每个字母的权值进行排序。然后依次进行赋值。

    注意:不能有前导零,所以要进行特判

    看代码吧:

    #include<bits/stdc++.h>
    using namespace std;
    string s[1100];
    int n;
    struct Node
    {
    	int num,sum;
    	bool first;
    }word[11];
    int p[11];
    bool vis[11];
    inline bool cmp(Node u,Node v)
    {
    	return u.sum>v.sum;
    }
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin>>n;
    	for(int i=1;i<=10;i++)word[i].num=i;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>s[i];
    		word[s[i][0]-'a'+1].first=1;
    		for(int j=0;j<s[i].size();j++)
    		{
    			word[s[i][j]-'a'+1].sum+=pow(10,s[i].size()-j);
    		}
    	}
    	sort(word+1,word+11,cmp);
    	/*for(int i=1;i<=10;i++)
    	{
    		cout<<word[i].num<<" "<<word[i].sum<<" "<<word[i].first<<endl;
    	}*/
    	for(int i=1;i<=10;i++)
    	{
    		if(word[i].first)
    		{
    			for(int j=1;j<=9;j++)if(!vis[j])
    			{
    				vis[j]=1;
    				p[word[i].num]=j;
    				break;
    			}
    		}
    		else
    		{
    			for(int j=0;j<=9;j++)if(!vis[j])
    			{
    				vis[j]=1;
    				p[word[i].num]=j;
    				break;
    			}
    		}
    	}
    	/*for(int i=1;i<=10;i++)cout<<p[i]<<" ";
    	cout<<endl;*/
    	int ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		int cnt=0;
    		for(int j=0;j<s[i].size();j++)
    		{
    			cnt=cnt*10+p[s[i][j]-'a'+1];
    		}
    		ans+=cnt;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

    T3 [CF2B]The least round way

    题目传送门

    看到这题,在比赛时写的是一种特别奇怪的做法,开了两个数组进行DP,一个存0的个数,另一个存去掉后面的0的数。

    最终只剩10分TAT

    老师讲:

    要把数分解成2和5,因为只有2*5才会出现10,数的后面才会出现0.

    注意:一但出现0,程序就会出错,because 0*XXX=0

    看代码吧:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010;
    const int INF=0x3f3f3f3f;
    int two[N][N];
    int five[N][N];
    int Map[N][N];
    int dp1[N][N],dp2[N][N];
    int n;
    inline int read()
    {
    	int tot=0;
    	char c=getchar();
    	while(c<'0'||c>'9')
    	{
    		c=getchar();
    	}
    	while(c>='0'&&c<='9')
    	{
    		tot=(tot<<1)+(tot<<3)+c-'0';
    		c=getchar();
    	}
    	return tot;
    }
    inline int get(int num,int c)
    {
    	int cnt=0;
    	while(num%c==0&&num!=0)
    	{
    		num/=c;
    		cnt++;
    	}
    	return cnt;
    }
    int main()
    {
    	n=read();
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			Map[i][j]=read();
    			if(Map[i][j]==0)
    			{
    				cout<<1<<endl;
    				return 0;
    			}
    			two[i][j]=get(Map[i][j],2);
    			five[i][j]=get(Map[i][j],5);
    		}
    	}
    	for(int i=2;i<=n;i++)dp1[i][0]=dp1[0][i]=dp2[i][0]=dp2[0][i]=INF;
    	/*for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)cout<<two[i][j]<<" ";
    		cout<<endl;
    	}cout<<endl;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)cout<<five[i][j]<<" ";
    		cout<<endl;
    	}cout<<endl;*/
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			dp1[i][j]=min(dp1[i-1][j],dp1[i][j-1])+two[i][j];
    			dp2[i][j]=min(dp2[i-1][j],dp2[i][j-1])+five[i][j];
    		}
    	}
    	/*for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)cout<<dp1[i][j]<<" ";
    		cout<<endl;
    	}cout<<endl;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)cout<<dp2[i][j]<<" ";
    		cout<<endl;
    	}cout<<endl;*/
    	cout<<min(dp1[n][n],dp2[n][n])<<endl;
    	return 0;
    }
    

    T4 [CF41D]Pawn

    题目传送门

    看到这题,二话不说先写爆搜,写完后发现30*30的数据就足以卡爆我的丑陋的代码了。

    于是很慌......

    最后想到了:这不就是那个叫什么...什么数字三角形嘛...只不过那个...这个就是方的...方的而已呀,最终写了个DP。

    看代码吧:

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,k;
    int Map[110][110];
    int ans=-1;
    bool dp[110][110][910];
    /*inline void DFS(int x,int y,int cnt)
    {
    	if(x<1||y<1||x>n||y>m)return;
    	//cout<<x<<" "<<y<<" "<<cnt<<endl;
    	if(x==n)
    	{
    		if((cnt+Map[x][y])%(k+1)==0)ans=max(ans,cnt+Map[x][y]);
    		return;
    	}
    	DFS(x+1,y+1,cnt+Map[x][y]);
    	DFS(x+1,y-1,cnt+Map[x][y]);
    }*/
    int main()
    {
    	//freopen("T4data.in","r",stdin);
    	char c;
    	ios::sync_with_stdio(false);
    	cin>>n>>m>>k;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=m;j++)
    		{
    			cin>>c;
    			Map[i][j]=c-'0';
    		}
    	}
    	/*for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=m;j++)cout<<Map[i][j]<<" ";
    		cout<<endl;
    	}*/
    	for(int i=1;i<=m;i++)
    	{
    		dp[1][i][Map[1][i]]=1;
    	}
    	for(int i=2;i<=n;i++)
    	{
    		for(int j=1;j<=m;j++)
    		{
    			for(int kk=Map[i][j];kk<=n*9;kk++)
    			{
    				dp[i][j][kk]=dp[i-1][j-1][kk-Map[i][j]] || dp[i-1][j+1][kk-Map[i][j]];
    			}
    		}
    	}
    	/*for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=m;j++)
    		{
    			for(int kk=1;kk<=n*9;kk++)cout<<dp[i][j][kk]<<" ";
    			cout<<endl;
    		}
    	}*/
    	for(int i=n*9;i>=1;i--)
    	{
    		if(i%(k+1))continue;
    		for(int j=1;j<=m;j++)
    		{
    			if(dp[n][j][i])
    			{
    				cout<<i<<endl;
    				return 0;
    			}
    		}
    	}
    	cout<<-1<<endl;
    	//for(int i=1;i<=m;i++)DFS(1,i,0);
    	//cout<<ans<<endl;
    	return 0;
    }
    

    [color{red}large ext{完结撒花} ]

  • 相关阅读:
    字节跳动总监知乎5716赞的Java开发笔记
    刚面完阿里Java高级岗40K的offer,这些技术你必须要掌握!
    HDOJ 1253 胜利大逃亡(bfs)
    swjtu 1962 A+B(模拟)
    swjtu 2213 A Game About Cards(模拟题)
    HDU 1544 Palindromes(回文子串)
    第八章 异常控制流
    第四讲 深入介绍信号与槽
    第三讲 对话框的创建
    第二讲 窗口部件的布局与通信
  • 原文地址:https://www.cnblogs.com/hulean/p/10799268.html
Copyright © 2020-2023  润新知