辽宁师范大学 • 张大为@https://daweizh.github.io/noip/

1.12 编程基础之函数与过程抽象(10)

  1. 简单算术表达式求值,http://noi.openjudge.cn/ch0112/01/
    #include<iostream>
    #include<cstring>
    using namespace std;
    int a,b;
    char c;
    char cs[10000];
    
    void abc(char * line){
      int len=strlen(line);
      int tmp=0;
      for(int i=0;i<len;i++){
        if('0'<=line[i]&&line[i]<='9'){
          tmp=tmp*10+line[i]-'0';
        }else{
          if(line[i]!=' '){
              c = line[i];
              a = tmp;
              tmp = 0;
          }
        }
      }
      b=tmp;
    }
    
    int read(int d,char e,int f){
      int tm=0;
      switch(e){
        case '+' : tm=d+f ; break;
        case '-' : tm=d-f ; break;
        case '*' : tm=d*f ; break;
        case '/' : tm=d/f ; break;
        case '%' : tm=d%f ; break;
      }
      return tm;
    }
    
    int main(){
      gets(cs);
      abc(cs);
      cout<<read(a,c,b)<<endl;
      return 0;
    }
    
  2. 短信计费,http://noi.openjudge.cn/ch0112/02/
    #include <iostream>
    #include <cmath>
    using namespace std;
    int n;
    double cost=0,msg;
    
    int main(){
      cin >> n;
      
      for(int i=0;i<n;i++){
        cin >> msg;
        cost = cost + ceil(msg/70)*0.1; 
      }
      printf("%.1f",cost);
      
      return 0;
    }
    
  3. 甲流病人初筛,http://noi.openjudge.cn/ch0112/03/
    #include <iostream>
    #include <string>
    using namespace std;
    
    string name;
    float w;
    bool c;
    int n,cnt;
    
    int main(){
      cin >> n;
      
      for(int i=0;i<n;i++){
        cin >> name >> w >> c;
        if(w>=37.5 && c){
          cout << name << endl;
          cnt++;
        }
      }
      cout << cnt << endl;
      
      return 0;
    }
    
  4. 最匹配的矩阵,http://noi.openjudge.cn/ch0112/04/
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int a[101][101],b[101][101];
    int n,m,r,s,sum,mn=0x77777777,row,col;
    
    int main(){
      cin >> n >> m;
      for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
          cin >> a[i][j];
        }
      }
      cin >> r >> s;
      for(int i=0;i<r;i++){
        for(int j=0;j<s;j++){
          cin >> b[i][j];
        }
      }
      for(int i=0;i<=n-r;i++){
        for(int j=0;j<=m-s;j++){
          sum = 0;
          for(int x=0;x<r;x++){
            for(int y=0;y<s;y++){
              sum = sum + abs(a[x+i][j+y]-b[x][y]);
            }
          }
          if(sum<mn){
            mn = sum;
            row=i;
            col=j;
          }
        }
      }
      for(int i=row;i<row+r;i++){
        cout << a[i][col];
        for(int j=col+1;j<col+s;j++){
          cout << " " << a[i][j];
        }
        cout << endl; 
      }
    
      return 0;
    }
    
  5. 统计单词数,http://noi.openjudge.cn/ch0112/05/
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        char temp;
        string str1,str2;
        int len=0;//len为单个字母长度
        int N=0,index=0;//N为单词出现次数,index为第一次出现的位置,
        cin>>str1;
        while(cin.peek()!='\n')//去掉多余部分
        {
            cin.get();
        }
        cin.get();//拿走换行符
        for(int i=0;str1[i]!='\0';i++)
        {
            if(str1[i]>='A'&&str1[i]<='Z')
                str1[i]+=-'A'+'a';//转换为小写
        }
        bool count=0;//标记
        while(cin.peek()!='\n')//结束条件为在第二行末尾输入了换行符
        {
            temp=cin.peek();//观察现在位置是否为空格
            if(temp==' ')//如果是空格就取走
            {
                cin.get();
                len++;//即便取走的是空格,位置也一定要加上
                continue;
            }
            count=0;
            cin>>str2;
            len+=str2.size();//现在的位置
            for(int i=0;str2[i]!='\0';i++)
            {
                if(str2[i]>='A'&&str2[i]<='Z')
                    str2[i]+=-'A'+'a';//转换为小写
            }
            if(str1==str2)
            {
                N++;//次数+1
                count=1;
            }
            if(count&&N==1)//两个逻辑条件保证index记录的一定是第一次出现时的位置
                index=len-str2.size();
        }
        if(N==0)
            cout<<N-1;//未找到输出整数-1
        else
            cout<<N<<" "<<index;//输出数据
        return 0;
    }
    
  6. 寻宝,http://noi.openjudge.cn/ch0112/06/
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int n,m,a,b,s,cnt=0,mod=20123;
    int rn[10005][105],c[10005];
    bool rs[10005][105];
    
    int main(){
      //freopen("P1076_1.in","r",stdin);
      scanf("%d%d",&n,&m);
      for(int i=1;i<=n;i++)
        for(int j=0;j<m;j++){
          scanf("%d%d",&rs[i][j],&rn[i][j]);
          c[i]+=rs[i][j];
        }
      scanf("%d",&s);
      for(int i=1;i<=n;i++){
        int r = rn[i][s];
        cnt = (cnt + r)%mod;
        r = r%c[i];
        if(r==0) r = c[i];
        while(r){
          if(rs[i][s]) r = r - 1;
          if(r==0) break;
          s++;
          if(s==m) s=0;
        }
      }
      cout << cnt << endl;	
      
      return 0;
    }
    
  7. 机器翻译,http://noi.openjudge.cn/ch0112/07/
    #include <iostream>
    #include <queue>
    #include <set>
    using namespace std;
    
    set<int> s;
    queue<int> q;
    int n,m,ans,x;
    
    int main(){
      
      cin >> m >> n;
      for(int i=0;i<n;i++){
        cin >> x;
        if(s.find(x)==s.end()){
          ans++;
          if(s.size()==m){
            int t = q.front();
            q.pop();
            s.erase(t);
          }
          s.insert(x);
          q.push(x);
        }
      }
      cout << ans << endl;
      
      return 0;
    }
    
  8. Vigenère密码,http://noi.openjudge.cn/ch0112/08/
    #include <iostream>
    #include <string>
    using namespace std;
    
    char m[26][26];
    string key,sect;
    
    void code(){
      for(int i=0;i<26;i++){
        for(int j=0;j<26;j++){
          m[i][j] = 'A'+(i+j)%26;
        }
      }
    }
    
    char trans(char src,char dst){
      char c, c1=src,c2=dst;
      if(c1>='a' && c1<='z') c1 = src-32;
      if(c2>='a' && c2<='z') c2 = dst-32;
      for(int i=0;i<26;i++){
        if(m[c1-'A'][i]==c2){
          c = 'A'+i;
          break;
        }
      }
      if(dst>='a' && dst<='z')
        c = c +32;
      return c;
    }
    
    int main(){
      code();
    
      cin >> key >> sect;
      int lk = key.size();
      int ls = sect.size();
      for(int i=0;i<ls;i++){
        cout << trans(key[i%lk],sect[i]);
      }
      cout << endl;
      
      return 0;
    }
    
  9. 图像旋转翻转变换,http://noi.openjudge.cn/ch0112/09/
    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
    int n,m,a[105][105],b[105][105];
    string s;
    
    void A(int n,int m ){
      memset(b,0,sizeof(b));
      for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
          b[j][n-i-1] = a[i][j];
        }
      }
      memset(a,0,sizeof(a));
      for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
          a[i][j]=b[i][j];
        }
      }	
      return;
    }
    
    void B(int n,int m ){
      memset(b,0,sizeof(b));
      for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
          b[m-j-1][i] = a[i][j];
        }
      }
      memset(a,0,sizeof(a));
      for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
          a[i][j]=b[i][j];
        }
      }	
      return;
    }
    
    void C(int n,int m ){
      memset(b,0,sizeof(b));
      for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
          b[i][j] = a[i][m-j-1];
        }
      }
      memset(a,0,sizeof(a));
      for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
          a[i][j]=b[i][j];
        }
      }	
      return;
    }
    
    void D(int n,int m ){
      memset(b,0,sizeof(b));
      for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
          b[i][j] = a[n-i-1][j];
        }
      }
      memset(a,0,sizeof(a));
      for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
          a[i][j]=b[i][j];
        }
      }	
      return;
    }
    
    int main(){
      cin >> n >> m;
      for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
          cin >> a[i][j];
      cin >> s;
      int len = s.size();
      for(int i=0;i<len;i++)
        switch(s[i]){
          case 'A': 
            A(n,m);
            swap(n,m);
            break;
          case 'B':
            B(n,m);
            swap(n,m);
            break;
          case 'C':
            C(n,m);
            break;
          case 'D':
            D(n,m);
            break;
        }
    
      for(int i=0;i<n;i++){
        cout << a[i][0];
        for(int j=1;j<m;j++)
          cout << " " << a[i][j];
        cout << endl;
      }
    
      return 0;
    }
    
  10. 素数对,http://noi.openjudge.cn/ch0112/10/
    #include <iostream>
    using namespace std;
    
    const int maxn = 10005;
    int used[maxn],number[maxn],n;
    
    int prime(int n){
      int cnt = 0;
      for(int i=2;i<=n;i++){
        if(!used[i]){
          number[++cnt]=i;
        }
        for(int j=1;(j<=cnt)&&(i*number[j]<=n);j++){
          used[i*number[j]] = true;
          if(i%number[j]==0) break;
        }		
      }
      return cnt;
    }
    
    int main(){
      cin >> n;
      int t = prime(n),flag=1;
      for(int i=1;i<t;i++)
        if(number[i+1]-number[i]==2)
          flag=0,cout << number[i] << " " << number[i+1] << endl;
      if(flag)
        cout << "empty" << endl;
        
      return 0;
    }
    

参考网址

  1. http://noi.openjudge.cn