A: 十六进制回文数
- 枚举判断
#include <bits/stdc++.h>
using namespace std;
#define ll long long
bool check1(int n){//判断本身是否回文
string s = to_string(n);
string s1 = s;
reverse(s1.begin(),s1.end());
return s == s1;
}
bool check2(int n){//判断十六进制数是否回文
string s="";
while(n){
int m = n%16;
string str="0";
if(m<10)str[0]='0'+m;
else str[0]='A'+m-10;
s+=str;
n/=16;
}
string s1 = s;
reverse(s1.begin(),s1.end());
return s == s1;
}
int main(){
int n,m;
int ans = 0;
scanf("%d%d",&m,&n);
for(int i = m;i <= n; i++)
if(!check1(i) && check2(i))ans++;
printf("%d\n",ans);
return 0;
}
B: lsx的立方体
- 每一个边长为1的小立方体可构成8个等边三角形
- 不管边长为多少都可以看成一个边长为1的小立方体
- 计算总共有多少个小立方体
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,k;
int main(){
while(~scanf("%d",&n)){
ll ans=n*n*n;//边长为1的立方体数量
for(int i = 2;i <= n; i++){
int m = (n-i)+1;
ans+=m*m*m;
}
printf("%lld\n",ans*8);
}
return 0;
}
C: X星切糕
- 贪心
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int n,ans;
scanf("%d",&n);
ans=20*(n/5);
n%=5;
if(n==4)ans+=15;
else if(n==3)ans+=11;
else if(n==2)ans+=7;
else if(n==1)ans+=3;
printf("%d\n",ans);
return 0;
}
D: 解密
- 枚举出每一个子串,查找是否是重复子串
#include<bits/stdc++.h>
using namespace std;
int Find(string str){
int len = str.length();
int maxx = 0;
for(int i= 0; i< len; i++){
for(int j= len- 1; j > i; j--){//枚举子串
string st = str.substr(i,j-i);
int len1 = st.length();
int from = str.find(st);//从前往后查找
int to = str.rfind(st);//从后往前查找
if(from!=to&&maxx<j-i){//两次查找位置不同,说明是重复子串
if(len1+from<=to)//两个相同的子串不允许出现交叉和重叠
maxx= j-i;
}
}
}
return maxx;
}
int main(){
string str;
cin>>str;
int in = Find(str);
cout<<in<<endl;
return 0;
}
E: 第K大数
- 简单模拟
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,k;
int main(){
scanf("%d%d",&n,&k);
set<int,greater<int> >st;//从大到小
while(n--){
int d;
scanf("%d",&d);
st.insert(d);
}
if(k>st.size())printf("-1\n");
else{
set<int>::iterator it=st.begin();
while(--k){
it++;
}
printf("%d\n",*it);
}
return 0;
}
F: 字符串变换
- 简单模拟
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,k;
int main(){
cin>>n>>k;
string s;
cin>>s;
string s1="";
for(int i=0;i+k<=n;i+=k){//能组成k个一组
for(int j=k-1;j>=0;j--){
if(islower(s[j+i]))s1+=toupper(s[j+i]);
else s1+=s[j+i];
}
}
for(int i=1;i<=n%k;i++){//多于部分
if(islower(s[n-i]))s1+=toupper(s[n-i]);
else s1+=s[n-i];
}
cout<<s1<<endl;
return 0;
}
G: 评分计算器
- 直接计算,注意全为0与去尾
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c,d,e;
float s;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
if(!a && !b && !c && !d && !e)printf("0.0\n");
else{
s=(float)(a+2*b+3*c+4*d+5*e)/(a+b+c+d+e);
s=(float)((int)(s*10))/10;//去尾
printf("%.1f\n",s);
}
return 0;
}
H: 缩页
- 将页数从小到大排序,按要求输出
#include<bits/stdc++.h>
using namespace std;
#define MAX 10000005
#define MA 100005
int a[MA];
char c[MAX];
int main(){
int i=0,j,k,t;
gets(c);
for(int j=0;j<strlen(c);j++){//将页数存入数组
while(j<strlen(c)&&isdigit(c[j])){
a[i]=a[i]*10+(c[j]-'0');
j++;
}
i++;
}
sort(a,a+i);//页数从小到大排序
for(k=0,t=a[0];k<i;k++){
if(k+1<i&&(a[k]==a[k+1]||a[k]+1==a[k+1]))continue;
//页数相同或页数加一等于后一页数,continue
else if(k!=i-1){//判断后面有无输出
if(t==a[k])printf("%d,",t);
else printf("%d-%d,",t,a[k]);
t=a[k+1];
}
else{
if(t==a[k])printf("%d\n",t);
else printf("%d-%d\n",t,a[k]);
t=a[k+1];
}
}
return 0;
}