#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <stack> #include <queue> #include <vector> #include <map> #include <set> #include <string> #include <iostream> #define INF 32768 #define mod 1000000007 #define ll long long using namespace std; int Getnum(char s[]) { int i, sum=0; for(i=0; s[i]; i++) sum = sum*10 + s[i]-'0'; return sum; } void Print(int num) { num--; if(num<26) { printf("%c", num+'A'); return ; } Print(num/26); printf("%c", num%26+'A'); } int main() { int T; scanf("%d", &T); while(T--) { char s[110]; scanf("%s", s); if(s[0]>='0' && s[0]<='9') { int num = Getnum(s); Print(num); printf("\n"); } else { int sum=0; for(int i=0; s[i]; i++) sum = sum*26 + s[i]-'A'+1; printf("%d\n", sum); } } return 0; }
C: 表达式求值
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
#define met(a,b) (memset(a,b,sizeof(a)))
const int N=550;
#define INF 0x3f3f3f3f
char s[N];
int Find3(int x) ///找到当前括号匹配的,
{
int i, sum=0;
for(i=x; s[i]; i++)
{
if(s[i]=='(')
sum ++;
if(s[i]==',')
{
sum --;
if(sum==0)
return i;
}
}
}
int Find4(int x) ///找到,后的第一个)
{
int i;
for(i=x; s[i]; i++)
if(s[i]==')')
return i-1;
}
int Getnum(int L, int R)
{
int i, sum=0;
for(i=L; i<=R; i++)
sum = sum*10 + s[i]-'0';
return sum;
}
int Slove(int x)
{
int L=x+3, Index1, Index2, Lsum, Rsum;
Index1 = Find3(x);
Index2 = Find4(Index1);
if(s[L+1]>='0' && s[L+1]<='9')
Lsum = Getnum(L+1, Index1-1);
else
Lsum = Slove(L+1);
if(s[Index1+1]>='0' && s[Index1+1]<='9')
Rsum = Getnum(Index1+1, Index2);
else
Rsum = Slove(Index1+1);
if(s[x]=='a')
return Lsum+Rsum;
if(s[x+1]=='a')
return max(Lsum, Rsum);
if(s[x+1]=='i')
return min(Lsum, Rsum);
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int ans;
scanf("%s", s);
ans = Slove(0);
printf("%d\n", ans);
}
return 0;
}
/**
22
add(1,2)
max(1,999)
add(min(1,1000),add(100,99))
add(min(1,1000),max(1,add(100,99)))
*/
#include <iostream> #include <stdio.h> #include <string> #include <algorithm> using namespace std; //这个表达式求值,要先算最小单元的数值,可以采用递归方式 char str[350]; //使用全局数据保存字符串 int first;//字符当前位置 int fun() //函数,分析字符 { int v,n;//保存数字及数字的位数 switch(str[first]) //分析字符串的开头字符 { case 'm': //有可能是max,min first+=3;//指向括号 if(str[first-2]=='i')//对于min return min(fun(),fun()); //如min(3,5),递归时就会分别返回3和5,然后当成min的参数 else return max(fun(),fun()); break; case 'a': //是add first+=3; return fun()+fun(); //如add(3,5),递归时就会返回3和5 break; case ',': //分隔符 case '(': case ')': first++;//跳过不处理 return fun();//继续递归 break; default: //数字 sscanf(str+first,"%d%n",&v,&n);//从字符str+first开始将数字读入v,数字位数为n first+=n;//走过数字 return v; break; } } int main() { int n; scanf("%d",&n);//n组测试数据 while(n--) { scanf("%s",str);//字符数据 cout<<fun()<<endl; first=0;//每次测试完要使first归零 } return 0; } /** 1000 add(1,2) max(1,999) add(min(1,1000),add(100,99)) add(min(1,1000),max(1,add(100,99))) */
D: 走迷宫
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
#define met(a,b) (memset(a,b,sizeof(a)))
const int N=1100;
#define INF 0x3f3f3f3f
int n, flag;
int a[N][N], vis[N][N];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
void DFS(int x, int y, int Min, int Max)
{
if(x==n && y==n)
{
flag = 1;
return ;
}
for(int i=0; i<4; i++)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if(nx>=1 && nx<=n && ny>=1 && ny<=n && a[nx][ny]>=Min && a[nx][ny]<=Max && !vis[nx][ny])
{
vis[nx][ny] = 1;
DFS(nx, ny, Min, Max);
}
if(flag)
return ;
}
}
int Slove(int mid, int Min, int Max)
{
int i;
for(i=Min; i<=Max-mid; i++)
{
if(a[1][1]<i || a[1][1]>i+mid) continue;
if(a[n][n]<i || a[n][n]>i+mid) continue;
flag = 0;
met(vis, 0);
vis[1][1] = 1;
DFS(1, 1, i, i+mid);
if(flag) return 1;
}
return 0;
}
int main()
{
while(scanf("%d", &n)!=EOF)
{
int i, j, Max=-INF, Min=INF;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
scanf("%d", &a[i][j]);
Max = max(Max, a[i][j]);
Min = min(Min, a[i][j]);
}
int L=0, R=Max-Min, mid, w, ans=R;
while(L<=R)
{
mid = (L+R)/2;
w = Slove(mid, Min, Max);
if(w)
{
ans = min(ans, mid);
R = mid-1;
}
else L = mid+1;
}
printf("%d\n", ans);
}
return 0;
}
勿忘初心