北京集训②DAY1 Morning

水题 最后一个非零数减1即可

 1 #include <cstdio>
 2 #include <cctype>
 3 
 4 const int MAXN=110;
 5 
 6 int n,cnt;
 7 
 8 int hh() {
 9     freopen("bit.in","r",stdin);
10     freopen("bit.out","w",stdout);
11     scanf("%d",&n);
12     cnt=1;
13     while(n) {
14         int t=n%10;
15         if(t==0) cnt*=10,n/=10;
16         else {
17             --n;
18             break;
19         }
20     }
21     printf("%d\n",n*cnt);
22     fclose(stdin);
23     fclose(stdout);
24     return 0;
25 }
26 
27 int sb=hh();
28 int main(int argc,char**argv) {;}
代码

正解是DP 然而这是可以打表找规律。。

 1 #include <cstdio>
 2 #include <cctype>
 3 
 4 int n,k,t;
 5 
 6 int a[10]={6,2,5,5,4,5,6,3,7,6};
 7 
 8 int hh() {
 9     freopen("stick.in","r",stdin);
10     freopen("stick.out","w",stdout);
11     scanf("%d",&n);
12     t=n;
13     if(n<=7) {
14         for(int i=1;i<=9;++i) if(a[i]==n) printf("%d",i);
15         goto NEXT;
16     }
17     
18     k=n%7;
19     if(k==0) while(n) printf("8"),n-=a[8];
20     
21     else if(k==2) {
22         printf("1");n-=a[1];
23         while(n) printf("8"),n-=a[8];
24     }
25     
26     else if(k==1) {
27         printf("10");n-=a[1],n-=a[0];
28         while(n) printf("8"),n-=a[8];
29     }
30     
31     else if(k==3) {
32         if(n==10) {
33             printf("22");
34             goto NEXT;
35         }
36         printf("200");n-=a[0]+a[0]+a[2];
37         while(n) printf("8"),n-=a[8];
38     }
39     
40     else if(k==4) {
41         printf("20");n-=a[2]+a[0];
42         while(n) printf("8"),n-=a[8];
43     }
44     
45     else if(k==5) {
46         printf("2");n-=a[2];
47         while(n) printf("8"),n-=a[8];
48     }
49     
50     else if(k==6) {
51         printf("6");n-=a[6];
52         while(n) printf("8"),n-=a[8];
53     }
54 NEXT:
55     printf(" ");
56     n=t;
57     t=n/2;
58     if(n-2*t<=1) --t;
59     for(int i=9;i>=1;--i) if(a[i]==(n-2*t)) {printf("%d",i);break;}
60     for(int i=1;i<=t;++i) printf("1");
61     return 0;
62 }
63 
64 int sb=hh();
65 int main(int argc,char**argv) {;}
模拟
 1 #include <cstdio>
 2 #include <cctype>
 3 
 4 int n;
 5 
 6 int s[10]={6,2,5,5,4,5,6,3,7,6};
 7 
 8 int a[100],ans[100];
 9 
10 bool pd(int x) {
11     if(x>ans[0]) return false;
12     if(x<ans[0]) {
13         ans[0]=x;
14         return true;
15     }
16     else
17       for(int i=1;i<=x;++i) {
18             if(ans[i]<a[i]) return false;
19           if(a[i]<ans[i]) return true;
20       }
21     return false;
22 }
23 
24 void DFS(int num,int cnt,int sum) {
25     if(num>9||sum==1||sum<0) return;
26     if(sum==0) {
27         if(pd(cnt)) {
28             for(int i=1;i<=cnt;++i) ans[i]=a[i];
29             ans[0]=cnt;
30         }
31         return;
32     }
33     int t=1;
34     while(sum-t*s[num]>=0) {
35         a[cnt+t]=num;
36         DFS(num+1,cnt+t,sum-t*s[num]);
37         ++t;
38     }
39     DFS(num+1,cnt,sum);
40 }
41 
42 int hh() {
43     n=61;
44     ans[0]=1e9;
45     for(int i=1;i<=9;++i) {
46         for(int j=0;j<=100;++j) a[j]=0;
47         if(n-s[i]>=0) 
48         a[1]=i,DFS(0,1,n-s[i]);
49     }    
50        printf("n==%d:",n);
51     for(int i=1;i<=ans[0];++i) printf("%d",ans[i]);
52     printf("\n");
53 }
54 
55 int sb=hh();
56 int main(int argc,char**argv) {;}
最小值搜索
 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int use[8]={-1,-1,1,7,4,2,0,8};
 5 int k;
 6 long long dp[16][101];
 7 void out(long long x)
 8 {
 9     if(x/10) out(x/10);
10     putchar(x%10+'0');
11 }
12 void solve_min()
13 {
14     if(k==6) { printf("0"); return; }
15     int len=k/7+1;
16     for(int i=2;i<8;i++) dp[1][i]=use[i];
17     dp[1][6]=6;
18     if(dp[1][k]) { out(dp[1][k]); return;}
19     for(int i=2;i<=len;i++)
20     {
21         for(int j=1;j<=k;j++)
22             for(int l=2;l<=7;l++)
23             {
24                 if(j-l<=1) continue;
25                 if(!dp[i-1][j-l]) continue;
26                 if(!dp[i][j]) dp[i][j]=dp[i-1][j-l]*10+use[l];
27                 else dp[i][j]=min(dp[i][j],dp[i-1][j-l]*10+use[l]);
28             }
29         if(dp[i][k]) { out(dp[i][k]); return; }
30     }    
31 }
32 void solve_max()
33 {
34     int len=k/2;
35     if(k&1)
36     {
37         printf("7");
38         for(int i=1;i<len;i++) printf("1");
39     }
40     else 
41     {
42         for(int i=1;i<=len;i++) printf("1");
43     }
44 }
45 int main()
46 {
47     freopen("stick.in","r",stdin);
48     freopen("stick.out","w",stdout);
49     scanf("%d",&k);
50     solve_min();
51     printf(" ");
52     solve_max();
53 }
DP正解

预处理每个位置往后没有重复能扩展到的最远位置

然后枚举之前听过i首歌

整个序列分为三部分,最前面不完整部分、中间完整几段、最后面不完整部分

枚举每一段的左端点,如果他能向右扩展的部分>=这一段的右端点,说明这是合法的一段,继续下一段

如果每一段都合法,那i就合法

 1 #include <cstdio>
 2 #include <cctype>
 3 #define min(a,b) a<b?a:b
 4 
 5 const int MAXN=100010;
 6 
 7 int n,m,ans;
 8 
 9 int a[MAXN],p[MAXN];
10 
11 bool t;
12 
13 bool vis[MAXN];
14 
15 inline void read(int&x) {
16     int f=1;register char c=getchar();
17     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
18     for(;isdigit(c);x=x*10+c-48,c=getchar());
19     x=x*f;
20 }
21 
22 void pre() {
23     int r=m;
24     vis[a[m]]=true;
25     p[m]=m;
26     for(int i=m-1;i;--i) {
27         if(!vis[a[i]]) vis[a[i]]=true,p[i]=r;
28         else {
29             while(r>i) {
30                 if(a[r]==a[i]) {r--;break;}
31                 vis[a[r--]]=false;
32             }
33             p[i]=r;
34         }
35     }
36     for(int i=1;i<=m&&t;++i) if(p[i]<m) t=false;
37 }
38 
39 inline bool check(int x) {
40     int l=0;
41     if(x) {
42         l=n-x;
43         if(p[1]<l) return false;
44     }
45     int r=l;
46     for(int i=l+1;i<=m;i+=n) {
47         r=min(m,r+n);
48         if(p[i]<r) return false;
49      }
50      return true;
51 }
52 
53 int hh() {
54     freopen("music.in","r",stdin);
55     freopen("music.out","w",stdout); 
56     read(n);read(m);
57     for(int i=1;i<=m;++i) read(a[i]);
58     
59     t=true,pre();
60     for(int i=0;i<n;++i)
61       if(n-i>m) ans+=t;
62       else ans+=check(i);
63     
64     printf("%d\n",ans);
65     fclose(stdin);fclose(stdout); 
66     return 0;
67 }
68 
69 int sb=hh();
70 int main(int argc,char**argv) {;}
代码

 

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
### 关于雅礼集训 2017 Day1 的题目及解析 #### 题目概述 根据已知引用内容[^3],雅礼集训 2017 Day1 的核心问题是关于矩阵操作的优化问题。给定一个 \(n \times m\) 的字符矩阵,其中 `#` 表示黑色格子,`.` 表示白色格子。目标是最小化将整个矩阵变为全黑所需的步数。 --- #### 解析与算法思路 ##### 输入描述 输入的第一行为两个整数 \(n\) 和 \(m\),分别代表矩阵的行数和列数。接下来 \(n\) 行每行包含长度为 \(m\) 的字符串,表示矩阵的内容。 ##### 输出描述 输出最小的操作次数使得整个矩阵变成全是黑色格子的状态。如果没有可行方案,则输出 `-1`。 --- ##### 算法设计 1. **可行性判断** 如果初始矩阵没有任何黑色格子 (`#`) 存在,则无法通过任何有限次操作使矩阵变黑,因此直接返回 `-1`[^4]。 2. **计算最少步数** 对于每一行,定义两种可能的操作方式: - 将该行全部涂黑。 - 不改变该行状态,仅依赖后续列操作来覆盖剩余白格。 同样地,对于每一列也存在类似的策略选择。最终的目标是综合考虑行列操作的影响,找到全局最优解。 3. **动态规划或贪心求解** 使用简单的遍历方法统计各行列中的黑白分布情况,并基于此决定最佳行动顺序。特别注意边界条件处理以及特殊情况下的额外开销评估。 ```cpp #include <bits/stdc++.h> using namespace std; const int MAXN = 1e3 + 5; int n, m, h[MAXN], l[MAXN]; char s[MAXN][MAXN]; int main(){ cin >> n >> m; bool has_black = false; for (int i = 1; i <= n; ++i){ cin >> (s[i]+1); for (int j = 1; j <= m; ++j){ if (s[i][j] == '#'){ has_black = true; h[i]++; l[j]++; } } } if (!has_black){ cout << "-1"; return 0; } int res = INT_MAX; for (int i = 1; i <= n; ++i){ res = min(res, m - h[i] + !l[i]); } int extra_cost = 0; for (int j = 1; j <= m; ++j){ if (l[j] != n) extra_cost += 1; } cout << res + extra_cost; } ``` 上述代码实现了基本逻辑框架,包括读取数据、初步分析是否存在解决方案的可能性以及最后一步汇总总成本的过程[^3]。 --- #### 复杂度分析 时间复杂度主要取决于两次嵌套循环扫描整个矩阵所需的时间量级 O(n*m),空间消耗同样维持在线性范围内 O(n+m)。 --- #### 注意事项 - 当前实现假设所有测试实例均满足合理范围内的尺寸规格;实际应用时需增加更多健壮性的错误检测机制。 - 结果验证阶段应充分考虑到极端情形比如完全空白或者满布障碍物等情况是否被妥善处置。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值