T1 餐馆吃饭
题解:
很容易想到,最少花费一定是四道菜中价格最小的一道和三道甜品中价格最小的一道之和。
#include<bits/stdc++.h>
using namespace std;
int a[10],b[10];
int main(){
for(int i=1;i<=4;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=3;i++){
scanf("%d",&b[i]);
}
sort(a+1,a+5);
sort(b+1,b+4);
printf("%d",a[1]+b[1]);
}
总结:
AC,就是有点懒,用了数组+sort。
T2 卡片
题解:
看到数据范围,可以直接暴搜,但是有一个问题需要解决,直接用vis存储状态有可能会空超,可以用哈希,降低空间。(虽然别的同学直接开了一个亿的布尔,没爆)
#include<bits/stdc++.h>
using namespace std;
#define hash_num 135377
#define LL unsigned long long
LL n,k,ans;
LL a[101];
LL vis[1000001];
bool tvis[101];
LL hash1(LL x){
LL m=x%hash_num;
while(vis[m]!=x&&vis[m]!=0){
m++;
}
return m;
}
void dfs(LL x,LL num){
if(x==k+1){
LL t=hash1(num);
if(!vis[t]){
ans++;
vis[t]=num;
}
return ;
}
for(LL i=1;i<=n;i++){
if(!tvis[i]){
tvis[i]=true;
if(a[i]<10)dfs(x+1,num*10+a[i]);
else dfs(x+1,num*100+a[i]);
tvis[i]=false;
}
}
}
int main(){
scanf("%lld%lld",&n,&k);
for(LL i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
dfs(1,0);
printf("%lld",ans);
}
总结:
AC,这种做题思路要保持,思考全面、仔细。
T3 数数
总结:
T4 划分
总结: