小插曲
祝大家五一劳动节快乐!
马上要开学了嘤嘤嘤
我。。。。怎么有没有看清楚题目啊!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
1,2,3,4,5,6,7
:)
直接把
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;
}