1.T14561 逃避
题解::
第一题水题,直接模拟就行了。
代码::
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; template<class T>inline void read(T &x) { x=0;int f=0;char ch=getchar(); while(ch<'0'||ch>'9')f|=(ch=='-'),ch=getchar(); while(ch<='9'&&ch>='0')x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=f?-x:x; return; } char s[100100]; int main() { gets(s); int l=strlen(s); bool flag=true; for(int i=0;i<l;i++) { if(s[i]=='.')flag=true; else if(flag) { if(s[i]<='z'&&s[i]>='a')s[i]=s[i]-'a'+'A'; if(s[i]>='A'&&s[i]<='z')flag=false; } else if(!flag){ if(s[i]<='Z'&&s[i]>='A')s[i]=s[i]-'A'+'a'; } } printf("%s",s); return 0; }
2.T14562 可耻
题解::
要求字典序最小,我们可以每次贪心取出不在最后的最大值和它的下一位,最大值可以用优先队列,求下一位用链表就行了。
#include<cstdio> #include<queue> #include<algorithm> #define re register using namespace std; template<class T>inline void read(T &x) { x=0;char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch<='9'&&ch>='0')x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); return; } int a[100100],k[100100],pre[100100],next[100100]; bool vis[100100]; priority_queue<int>Q; int main() { int n; read(n); for(re int i=1;i<=n;i++) { read(a[i]); Q.push(a[i]); k[a[i]]=i; next[i]=i+1; pre[i]=i-1; } for(re int i=1;i<=n/2;i++) { while(vis[Q.top()])Q.pop(); re int x=k[Q.top()],y=next[x]; if(y==n+1){ Q.pop(); while(vis[Q.top()])Q.pop(); re int X=k[Q.top()],Y=next[X]; printf("%d %d ",a[X],a[Y]); pre[next[Y]]=pre[X]; next[pre[X]]=next[Y]; vis[a[X]]=true;vis[a[Y]]=true; Q.push(a[x]); } else { printf("%d %d ",a[x],a[y]); pre[next[y]]=pre[x]; next[pre[x]]=next[y]; vis[a[x]]=true;vis[a[y]]=true; } } return 0; }
3.T14563 但有用
题解::先3进制枚举每一行加的,再贪心求出每一列就行了。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; template<class T>inline void read(T &x) { x=0;char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch<='9'&&ch>='0')x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); return; } int num[20],a[20][20],c[20][3]; void calc(int x) { memset(num,0,sizeof(num)); int t=0; while(x) { num[++t]=x%3; x/=3; } } int main() { int n,m,sum,ans=0; read(n);read(m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) read(a[i][j]); int k=1; for(int i=1;i<=n;i++)k*=3; for(int o=0;o<k;o++) { calc(o);memset(c,0,sizeof(c));sum=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]+num[i]<=12)c[j][(a[i][j]+num[i])%3]++; for(int j=1;j<=m;j++) sum=sum+max(c[j][0],max(c[j][1],c[j][2])); ans=max(sum,ans); } printf("%d\n",ans); return 0; }
总结::
这套题与之前的题相比较水,前两道题很简单,考试时码的也很快,打完对拍后才过了一个小时,给第三题留的时间多.。继续保持。