传智杯还是很适合新手的~~~ 对 我就是第二的混子 完全是诈胡QAQ
萌新的我还是发一下题解吧
A 题
模拟 不说~~
#include<iostream>
using namespace std;
int n,v,m,a;
int main(){
long long res=0;
cin>>n>>v>>m>>a;
int cnt=0;
while(n--){
res+=v;
cnt++;
if(cnt==m){
v+=a;
cnt=0;
}
}
cout<<res<<endl;
return 0;
}
B题
很多人说有坑em。。。其实按照提意来就可以了那个向下取整先*10后取整就可以了
如果不确定试一下就行了 不知道为啥有人第二题没过~~~
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
double sig=4.0;
int main(){
int n;
cin>>n;
double res=0;
if(n>=90) res=4.0;
else if(n>=60&&n<90) res=4.0-0.1*(90-n);
else{
int temp=(int)(sqrt(n)*10);
if(temp<60) res=0.0;
else{
res=4.0-0.1*(90-temp);
}
}
printf("%.1lf\n",res);
return 0;
}
C题
没学过sort的同学可以去学一下 我喜欢用运算符重载来重载排序
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1000100;
struct zzz{
int id;
int t;
int k;
int sum;
bool operator< (const struct zzz& d)const{
if(d.sum!=sum) return d.sum<sum;
else if(d.t!=t) return d.t<t;
else return id<d.id;
}
}a[N];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
a[i].id=i;
cin>>a[i].t>>a[i].k;
a[i].sum=a[i].t*a[i].k;
// cout<<a[i].sum<<endl;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
cout<<a[i].id<<" ";
// cout<<a[i].sum<<endl;
}
cout<<endl;
return 0;
}
D题
D题我看好多人有错 但我觉得还好…不知道为什么 是不是大家字符串的写法不太懂
思路上我也被小卡了以下 原本移位hash可以 但后来发现不行(stl万岁~~~) 只能老老实实模拟了/(ㄒoㄒ)/~~
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int N = 1010;
struct zzz{
int id;
char name[N];
bool st;
}a[N];
int n;
int cnt;
int num;
int main(){
cin>>n;
while(n--){
char op[N];
cin>>op;
if(!strcmp(op,"touch")){
char f[N];
cin>>f;
bool flag = false;
for(int i=1;i<=cnt;i++){
if(!strcmp(f,a[i].name)){
flag=true;
}
}
if(!flag){
++cnt;
++num;
a[cnt].id=num;
memcpy(a[cnt].name,f,sizeof f);
a[cnt].st=true;
}
}
if(!strcmp(op,"rename")){
char oldname[N],newname[N];
cin>>oldname>>newname;
for(int i=1;i<=cnt;i++){
if(!strcmp(oldname,a[i].name)){
memcpy(a[i].name,newname,sizeof newname);
}
}
}
if(!strcmp(op,"rm")){
char f[N];
cin>>f;
for(int i=1;i<=cnt;i++){
if(!strcmp(f,a[i].name)){
a[i].st=false;
}
}
}
if(!strcmp(op,"ls")){
for(int i=1;i<=cnt;i++){
if(a[i].st){
cout<<a[i].name<<endl;
}
}
}
}
return 0;
}
E题
非常裸的暴搜 我原本以为要用dp 后来一看6的10次方6000w 可以 这很暴力~~~
思路上就是枚举每一位的选法 当选够6位的时候判断以下当前的数字是否是k的倍数 注意最后取模就可以了 实在不放心 你可以边++边取模 都行~~
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 15,mod=1e9+7;
int a[N];
bool st[N];
int n,k;
long long res;
void check(){
long long temp=0;
for(int i=0;i<n;i++){
temp=temp*10+a[i];
}
if(temp%k==0)res++;
}
void dfs(int u){
if(u==n){
check();
return;
}
for(int i=1;i<=6;i++){
a[u]=i;
dfs(u+1);
}
}
int main(){
cin>>n>>k;
dfs(0);
cout<<res%mod<<endl;
return 0;
}
大家有什么问题可以私信我哈 虽然我算法确实很low 但是热爱算法的心希望大家也能有 即使被虐
我们也还是要向前冲~~~(ง •_•)ง