纪中2020.5.2普及C组模拟赛总结

小插曲

祝大家五一劳动节快乐!
马上要开学了嘤嘤嘤


我。。。。怎么有没有看清楚题目啊!T1爆0,找了好久没找到错误,刚想问老师,发现没输出第二行的数字!!!

总分:

0 ( 唉 ) + 0 + 100 + 0 = 100 p t s 0(唉)+0+100+0=100pts 0+0+100+0=100pts


题解:

T1

这题比较简单,直接模拟即可;
请看注释。

A C   C o d e AC~Code AC Code

//不要问我考试的时候为什么没有AC
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int a[50],minn=21474836,maxx;
int pdzs,w=1;
string s;
int main()
{
	freopen("word.in","r",stdin);
	freopen("word.out","w",stdout);
	cin>>s;
	for(int i=0; i<=s.size()-1; i++)
	   a[s[i]-96]+=1;   //统计&储存
	for(int i=1; i<=26; i++)
	 {
	 	if(a[i]==0)
	 	  continue;
	 	if(a[i]>maxx)    //找最大最小
	      maxx=a[i];
	    if(a[i]<minn)
		  minn=a[i];
	 }
	pdzs=maxx-minn;
	if(pdzs==0||pdzs==1)   //特判
	 {
	 	cout<<"No Answer";
	 	cout<<endl<<0;
	 	return 0;
	 }
	for(int i=2; i*i<=pdzs; i++)    //筛质数
	 {
	 	if(pdzs%i==0)   //不是质数
	 	 {
	 	 	cout<<"No Answer";
	 	 	cout<<endl<<0;
	 	 	return 0;
	 	 }
	 }
	cout<<"Lucky Word";  //是质数
	cout<<endl<<pdzs;
	return 0;
} 

T2

把序列里的数转换成二进制,
再把这些数弄成十进制,你会发现:
1 , 2 , 3 , 4 , 5 , 6 , 7 1,2,3,4,5,6,7 1234567
:)


直接把 K K K转换成二进制再转换成原来的数就好了。
灋匼
A C   C o d e AC~Code AC Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int a[1010],n,k,c;
long long ans=0;
int main()
{
	freopen("sequence.in","r",stdin);
    freopen("sequence.out","w",stdout);
    cin>>n>>k;
    while(k!=0)
	  a[++c]=k%2,k/=2;  //转二进制
    for(int i=c; i>=1; i--)
        ans+=pow(n,i-1)*a[i];  //转十进制
    cout<<ans;
    return 0;
}

T3

这道题我们可以用一种类似于贪心的暴力方法去做。
我们从最后一位往前枚举字符,看看当前字符满不满足条件,满足就向前推,得到一个可行的字符串就输出 b r e a k break break
注释很详细

A C   C o d e AC~Code AC Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
char str[30];
int s,t,w;
int main()
{
	freopen("count.in","r",stdin);
	freopen("count.out","w",stdout);
    cin>>s>>t>>w;
	cin>>str;
    for(int i=1; i<=5; i++)   //五个字符串
     {
        for(int j=w-1; j>=0; j--) //从最后一位往前枚举字符
         {
            if(str[j]+1<=97+t-w+j) //看看当前字符满不满足条件
             {
                str[j]+=1;
                for(int k=j+1; k<w; k++)  //后面每一位的都要变
                   str[k]=str[j]+k-j;
                cout<<str<<endl;
                break;
             }
         }
     }
    return 0;
}

T4

这道题其实可以用 三 维 D P 三维DP DP做出来

我们一边传纸条一边判断上下左右的大小,
找到最大的就往那里累加,
然后继续走,直到中点为止。

看!注!释!
A C   C o d e AC~Code AC Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int f[501][101][101];
int a[101][101];
int m,n,js;
int main()
{
	freopen("message.in","r",stdin);
	freopen("message.out","w",stdout);
    cin>>m>>n;
    for(int i=1; i<=m; i++)
     for(int j=1; j<=n; j++)
        cin>>a[i][j];
    memset(f,-1,sizeof(f)); 
    f[2][1][1]=0;   //初始化起点
    for(int k=3; k<m+n; k++)   //枚举路径
     for(int i=1; i<n; i++)     //枚举斜线
      for(int j=i+1; j<=n; j++)
        {
          js=f[k][i][j];
          js=max(f[k-1][i][j],js);   //网上下左右四个方向走
          js=max(f[k-1][i-1][j],js);
          js=max(f[k-1][i][j-1],js);
          js=max(f[k-1][i-1][j-1],js);
          if(js==-1) continue;  //两条路(自己理解一下)
          f[k][i][j]=js+a[k-i][i]+a[k-j][j];  //累计
        }
    cout<<f[m+n-1][n-1][n];
    return 0;
}

细心审题!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值