CF Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)
1、 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)
B. Batch Sort 暴力枚举,水
1、题意:n*m的数组,每行最多可交换1次,列最多可交换两列,问最终是否可以变换到每行都是1~m。
2、总结:暴力即可。
#include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define LL long long using namespace std; const int N=400100,MAX=1000100; int n,m,flag; int a[30][30],vis[30]; void exchange(int i,int j) { int t; FF(l,1,n){ t=a[l][i],a[l][i]=a[l][j],a[l][j]=t; } } int is() { int num=0; FF(l,1,n){ num=0; FF(i,1,m){ if(a[l][i]!=i){ num++; if(num>2){return 0;} } } } return 1; } void solve() { if(is()){flag=1;return ;} FF(i,1,m-1)FF(j,i+1,m) { exchange(i,j); if(is()){flag=1;return ;} exchange(i,j); } } int main() { while(~scanf("%d%d",&n,&m)) { FF(i,1,n)FF(j,1,m)cin>>a[i][j]; flag=0; solve(); if(flag)puts("YES"); else puts("NO"); } return 0; }
D. Dense Subsequence 暴力枚举
1、题意:小写字母组成的字符串中选出一些位置,使得任意的间距为m的区间至少要有一个字符被选出。字典序最小输出。
2、总结:看了题解,原来还是暴力枚举
2、思路:在26个小写字母中,如果选出了ch,那么比ch小的字母都要选才可保证字典序最小。所以,假设选出的字母中最大的是ch,只要搜出ch最少需要多少个即可。也就是对26个字母逐一搜一遍。
#include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define LL long long using namespace std; const int N=100100,MAX=1000100; int m,len; char str[N]; int solve(int ans) { int pre=-1,now=-1,num=0; F(i,0,len){ if(str[i]-'a'<=ans){ now=i; if(str[i]-'a'<ans)pre=i; } if(i-pre==m) { if(now>pre) num++,pre=now; else return -1; } } return num; } int main() { scanf("%d%s",&m,str); len=strlen(str); int vis[26]; mes(vis,0); F(i,0,len) vis[str[i]-'a']++; F(i,0,26){ int flag=solve(i); if(flag!=-1){ F(j,0,i)F(l,0,vis[j]){ printf("%c",'a'+j); } F(j,0,flag) printf("%c",'a'+i); puts(""); break; } } return 0; }