问题 A: A018蜜蜂路线
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
int dp[100];
int main(){
int m,n;
scanf("%d%d",&m,&n);
dp[m + 1] = 1;
dp[m + 2] = 2;
dp[m + 3] = 1 + 2;
for(int i = m + 3;i <= n;i++){
dp[i] = dp[i - 1] + dp[i - 2];
}
printf("%d\n",dp[n]);
}
问题 B: B006 俄罗斯套娃
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
int arr[1005];
void swap(int arr[],int a,int b){
int t = arr[a];
arr[a] = arr[b];
arr[b] = t;
}
int main(){
int n;
int cnt = 0;
bool change = false;
bool shao = false;
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&arr[i]);
}
for(int i = 0;i < n - 1;i++){
for(int k = 0;k < n - i - 1;k++){
if(arr[k] > arr[k + 1]){
swap(arr,k,k + 1);
change = true;
cnt++;
if(cnt > n * (n - 1) / 2 - 1){
shao = true;
break;
}
}
}
if(!change || shao)break;
}
if(!shao)printf("YES\n");
else printf("NO\n");
}
问题 C: C001 字符串计数
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
string a[100005];
int times[100005];
int main(){
int n;
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n;i++){
cin >> a[i];
}
//cout << a[n - 1];
sort(a,a+n);
// for(int i = 0;i < n;i++){
// cout << a[i] << ' ';
// }
int cnt = 1;
for(int i = 0;i < n;i++){
if(a[i] == a[i + 1]){
cnt++;
}else{
times[cnt]++;
cnt = 1;
}
}
for(int i = 1; i <= 100000;i++){
if(times[i]!=0)printf("%d %d\n",i,times[i]);
}
}
}
问题 D: D002 最长上升子序列
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int dp[1005];
int main(){
int n;
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n;i++){
scanf("%d",&a[i]);
}
fill(dp,dp+1005,1);
for(int i = 1;i < n;i++){
for(int k = i - 1;k >= 0;k--){
if(a[i] > a[k]){
dp[i] = max(dp[i],dp[k] + 1);
}
}
}
printf("%d\n",dp[n - 1]);
}
}
问题 E: E009 小木棒
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
int stick[70];
int visit[70];
int stick_sum;
int now_ave,n;
bool dfs(int len,int ok_stick,int index){ //剩余长度 已拼好木棒数 当前拼接的下标
if(ok_stick == n)return true;//达到拼接后木棍总长度,说明小木棒全部用完,搜索结束
if(len == 0){
len = now_ave;
index = n;
}
for(int i = index - 1;i >= 0;i--){
if(stick[i] > len)continue;
if(!visit[i] && stick[i] <= len){
visit[i] = true;
if(dfs(len - stick[i],ok_stick + 1,i))return true;
visit[i] = false;
if(len == now_ave)return false;
}
}
return false;
}
int main(){
int max_stick,min_stick,lens_sum;
while(scanf("%d",&n) != EOF){
if(n == 0)break;
lens_sum = 0;
for(int i = 0;i < n;i++){
scanf("%d",&stick[i]);
lens_sum += stick[i];
}
sort(stick,stick + n);
max_stick = stick[n - 1];
min_stick = stick[0];
int res = lens_sum;
for(int i = min_stick;i <= lens_sum / 2;i++){
if(lens_sum % i == 0){
//更新平均长度,visit初始化,更新需要的木棒数
now_ave = i;
fill(visit,visit + n,0);
stick_sum = lens_sum / now_ave;
//深搜
if(dfs(i,0,n)){
res = i;
break;
}
}
}
printf("%d\n",res);
}
}
问题 F: F008 排队买饭
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
double a[10000];
int main(){
int n;
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n;i++){
scanf("%lf",&a[i]);
}
sort(a,a+n);
double time = 0;
for(int i = 0;i < n;i++){
time += a[i] * (n - i);
}
double res = time / n;
printf("%.2f\n",res);
}
}