A题(填空)日期统计
dfs+剪枝
#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
const int N=3e8+10;
int n,m,ans,k;
int a[110],vis[N];
bool check(int date) {
if(vis[date])return false;
vis[date]=1;
int mm=date/100%100;
int dd=date%100;
if(mm<1||mm>12)return false;
if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12) {
if(dd>=1&&dd<=31)return true;
} else if(mm==2) {
if(dd>=1&&dd<=28)return true;
} else if(dd>=1&&dd<=30)return true;
return false;
}
void dfs(int x,int cnt,int date) {
//传入当前位置,第几位,日期
if(x==100)return ;
if(cnt==8) {
if(check(date))ans++;
return ;
}
if((cnt==0&&a[x]==2)||(cnt==1&&a[x]==0)||(cnt==2&&a[x]==2)||(cnt==3&&a[x]==3)||(cnt==4&&a[x]>=0&&a[x]<=1)||(cnt==5&&a[x]>=0&&a[x]<=9)||(cnt==6&&a[x]>=0&&a[x]<=3)||(cnt==7&a[x]>=0&&a[x]<=9))
dfs(x+1,cnt+1,date*10+a[x]);//合法可以选
dfs(x+1,cnt,date);//不选
}
int main() {
/*
5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2
7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1
0 0 9 4 8 0 9 1 2 8 5 0 2 5 3 3
*/
for(int i=0; i<100; i++)cin>>a[i];
dfs(0,0,0);
cout<<ans;
return 0;
}
答案:235
B题(填空)01串的熵
考察枚举,遇见这种式子不要慌,慢慢分析推导
注意浮点数的处理方式每次用1.0乘上一个int数转为浮点数
注意log函数的使用
注意结果的判断方式
#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
const int N=23333333;
int n,m,k;
double ans=11625907.5798,esp=1e-4;
int main() {
for(int m=0;m<=N/2;m++){
//枚举0的个数
n=N-m;//1的个数
double res=-1.0*m*m/N*log2(1.0*m/N)-1.0*n*n/N*log2(1.0*n/N);
if(fabs(res-ans)<esp){
cout<<m<<endl;
return 0;
}
}
return 0;
}
C题冶炼金属
二分转换率
#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
const int N=1e4+10;
int n,m,k,ans;
int a[N],b[N];
bool check_min(int v) {
for(int i=1; i<=n; i++) {
if(a[i]/v>b[i])return false;
}
return true;
}
bool check_max(int v) {
for(int i=1; i<=n; i++) {
if(a[i]/v<b[i])