• 【NOIp】NOIp2007


    NOIp2007

    T1 统计数字

    标签:排序

    这题没啥可写的......一遍排序统计次数就行了

    code

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 namespace gengyf{
     4 #define ll long long
     5     inline int read(){
     6         int x=0,f=1;char s=getchar();
     7         while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
     8         while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
     9         return x*f;
    10     }
    11     int n,ans=1;
    12     int a[200005];
    13     int main(){
    14         n=read();
    15         for(int i=1;i<=n;i++){
    16             a[i]=read();
    17         }
    18         sort(a+1,a+1+n);
    19         for(int i=2;i<=n;i++){
    20             if(a[i]==a[i-1])ans++;
    21             else{
    22                 printf("%d %d
    ",a[i-1],ans);
    23                 ans=1;
    24             }
    25         }
    26         printf("%d %d",a[n],ans);
    27         return 0;
    28     }
    29 }
    30 int main(){
    31     gengyf::main();
    32     return 0;
    33 }
    T1

    T2 字符串的展开

    标签:模拟,字符串

    细节!

    <1>当出现"5-x"这种一边是数字一边是字母的时候直接输出

    <2>首尾是"-"时原样输出

    <3>两个或多个连着的"-"时也是原样输出

    其余的按题意模拟即可

    code(好像是很久之前写的

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<string>
     6 #include<algorithm>
     7 using namespace std;
     8 string word;
     9 bool flag;
    10 char ans[1000000];
    11 int p1,p2,p3,len;
    12 char check(char c) {
    13     if (p1==1) return tolower(c);
    14     else if (p1==2) return toupper(c);
    15     else return '*';
    16 }
    17 int main(){
    18     cin>>p1>>p2>>p3;
    19     cin>>word;
    20     len=word.length();
    21     for(int i=0;i<=len;++i){
    22         int cnt=0;
    23         if(word[0]=='-'){
    24             if(flag);
    25             else{
    26                 cout<<'-'; 
    27                 flag=1;
    28                 continue;
    29             }
    30         }
    31         if(word[i]=='-'){
    32             if(word[i-1]>=word[i+1]||(word[i-1]>=48&&word[i-1]<=57&&word[i+1]>=65)||word[i-1]=='-'||word[i+1]=='-'){
    33                     cout<<word[i]; 
    34                     continue;
    35                 }
    36             if(p3==1){
    37                 for(int j=word[i-1]+1;j<word[i+1];++j){
    38                     for(int k=1;k<=p2;++k){
    39                         ans[++cnt]=j;
    40                     }
    41                 }
    42                 for(int q=1;q<=cnt;++q){
    43                     cout<<check(ans[q]);
    44                 }
    45             }
    46             if(p3==2){
    47                 for(int j=word[i+1]-1;j>=word[i-1]+1;--j){
    48                     for(int k=1;k<=p2;++k){
    49                         ans[++cnt]=j;
    50                     }
    51                 }
    52                 for(int q=1;q<=cnt;++q) {
    53                     cout<<check(ans[q]);
    54                 }
    55             }
    56         }
    57         else cout<<word[i];
    58     }
    59     return 0;
    60 }
    T2

    T3 矩阵取数游戏

    标签:dp,高精度

    __int128乱搞

    可以发现行与行之间无关,所以对每一行区间dp求最大值再相加即可

    f[i][j]=max(f[i][j-1],f[i+1][j])对于区间[i,j]只能从[i+1,j]或[i,j+1]转移

    先取后面的为f[i][j-1]即f[i][j-1]*2+a[j]*2相当于把以后要取的所有数*2,也就是那个什么乘2^i

    先取前面的同理 f[i+1][j]*2+a[i]*2

    所以转移方程为f[i][j]=max(f[i+1][j]*2+a[i]*2,f[i][j-1]*2+a[j]*2)

    会爆long long 需要高精,我太懒了写的__in128

    code

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<string>
     6 #include<algorithm>
     7 using namespace std;
     8 string word;
     9 bool flag;
    10 char ans[1000000];
    11 int p1,p2,p3,len;
    12 char check(char c) {
    13     if (p1==1) return tolower(c);
    14     else if (p1==2) return toupper(c);
    15     else return '*';
    16 }
    17 int main(){
    18     cin>>p1>>p2>>p3;
    19     cin>>word;
    20     len=word.length();
    21     for(int i=0;i<=len;++i){
    22         int cnt=0;
    23         if(word[0]=='-'){
    24             if(flag);
    25             else{
    26                 cout<<'-'; 
    27                 flag=1;
    28                 continue;
    29             }
    30         }
    31         if(word[i]=='-'){
    32             if(word[i-1]>=word[i+1]||(word[i-1]>=48&&word[i-1]<=57&&word[i+1]>=65)||word[i-1]=='-'||word[i+1]=='-'){
    33                     cout<<word[i]; 
    34                     continue;
    35                 }
    36             if(p3==1){
    37                 for(int j=word[i-1]+1;j<word[i+1];++j){
    38                     for(int k=1;k<=p2;++k){
    39                         ans[++cnt]=j;
    40                     }
    41                 }
    42                 for(int q=1;q<=cnt;++q){
    43                     cout<<check(ans[q]);
    44                 }
    45             }
    46             if(p3==2){
    47                 for(int j=word[i+1]-1;j>=word[i-1]+1;--j){
    48                     for(int k=1;k<=p2;++k){
    49                         ans[++cnt]=j;
    50                     }
    51                 }
    52                 for(int q=1;q<=cnt;++q) {
    53                     cout<<check(ans[q]);
    54                 }
    55             }
    56         }
    57         else cout<<word[i];
    58     }
    59     return 0;
    60 }
    T3

    T4 树网的核

    标签:dp

    我只会辣鸡n^3做法(因为好想啊QAQ

    code

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 namespace gengyf{
     4     inline int read(){
     5         int x=0,f=1;char s=getchar();
     6         while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
     7         while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
     8         return x*f;
     9     }
    10     const int inf=0x3f3f3f3f;
    11     const int N=310;
    12     int m[N][N],n,s,ans=inf;
    13     int main(){
    14         n=read();s=read();
    15         for(int i=1;i<=n;i++)
    16             for(int j=1;j<=n;j++){
    17                 m[i][j]=inf;
    18                 if(i==j)m[i][j]=0;
    19             }
    20         for(int i=1;i<n;i++){
    21             int x,y,z;
    22             x=read();y=read();z=read();
    23             m[x][y]=min(z,m[x][y]);
    24             m[y][x]=m[x][y];
    25         }
    26         for(int k=1;k<=n;k++)
    27             for(int i=1;i<=n;i++)
    28                 for(int j=1;j<=n;j++){
    29                     if(m[i][k]==inf||m[k][j]==inf)continue;
    30                     else m[i][j]=min(m[i][k]+m[k][j],m[i][j]);
    31                 }
    32         int l,r,len=0;
    33         for(int i=1;i<=n;i++)
    34             for(int j=1;j<=n;j++){
    35                 if(m[i][j]>=inf||m[i][j]<=len)continue;
    36                 len=m[i][j];
    37                 l=i;r=j;
    38         }
    39         for(int i=1;i<=n;i++){
    40             if(m[l][i]+m[i][r]!=len)continue;
    41             for(int j=1;j<=n;j++){
    42                 if(m[l][j]+m[r][j]!=len)continue;
    43                 if(m[i][j]>s)continue;
    44                 int ecc=-inf;
    45                 for(int k=1;k<=n;k++){
    46                     ecc=max(ecc,m[i][k]+m[j][k]-m[i][j]>>1);
    47                 }
    48                 ans=min(ans,ecc);
    49             }
    50         }
    51         printf("%d",ans);
    52         return 0;
    53     }
    54 }
    55 int main(){
    56     gengyf::main();
    57     return 0;
    58 }
    T4

  • 相关阅读:
    Java基础教程:对象比较排序
    算法:深度优先搜索
    微信小程序开发:学习笔记[5]——JavaScript脚本
    微信小程序开发:学习笔记[4]——样式布局
    设计模式:学习笔记(8)——装饰器模式
    设计模式:学习笔记(7)——原型模式
    设计模式——单例模式解析
    玩转Android之数据库框架greenDAO3.0使用指南
    Android开发工具——Android Studio调试技巧
    VR开发的烦恼——范围限制
  • 原文地址:https://www.cnblogs.com/gengyf/p/11449331.html
Copyright © 2020-2023  润新知