标签:区间贪心 mem doc ref get algo ++ str 奇数
A. Average Height
奇数放一侧,偶数放一侧即可。
AC代码如下:
#include<cstring> #include<algorithm> #include<cmath> #include<iostream> #include<queue> #include<cstdio> #include<set> #include<vector> #define MAXN 100005 #define MOD 1000000 int t,n; int a[2005],b[2005]; using namespace std; int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); int cnt1=0,cnt2=0; for(register int i=0;i<n;++i){ int temp; scanf("%d",&temp); if(temp&1) a[cnt1++]=temp; else b[cnt2++]=temp; } for(register int i=0;i<cnt1;++i) printf("%d ",a[i]); for(register int i=0;i<cnt2;++i) printf("%d ",b[i]); printf("\n"); } return 0; }
B. TMT Document
首先判断t和m的个数是否分别为2k和k。
再对前k个t判断是否存在一个不同的m大于他。再对后k个t判断是否存在一个不同的m小于他。
AC代码如下:
#include<cstring> #include<algorithm> #include<cmath> #include<iostream> #include<queue> #include<cstdio> #include<set> #include<vector> #define MAXN 100005 #define MOD 1000000 int t,n; char a[MAXN]; int post[MAXN],posm[MAXN],vis[MAXN]; bool cmp (int a,int b){return a>b;} using namespace std; int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); scanf("%s",a); memset(vis,0,sizeof(vis)); int cnt1=0,cnt2=0,flag=1,tempflag=1;//前者为T,后者为M for(register int i=0;i<n;++i){ if(a[i]==‘T‘) post[cnt1++]=i; else if(a[i]==‘M‘) posm[cnt2++]=i; } if(cnt1!=2*cnt2) printf("NO\n"); else{ for(register int i=0;i<cnt1/2;++i){ if(posm[i]<post[i]){ flag=0; break; } } if(flag){ for(register int i=cnt1/2;i<cnt1;++i){ if(posm[i-cnt1/2]>post[i]){ flag=0; break; } } } if(flag) printf("YES\n"); else printf("NO\n"); } } return 0; }
C. The Sports Festival (dp)
首先将s数组从小到大进行排序。
设一个区间的左端点为l,右端点为r
故对于一个区间的值为s[r]-s[l]。
对于一个区间的值的和为min(dp[l+1][r],dp[l][r-1])+s[r]-s[l]
dp求解即可。(之前一直想着贪心。即从0~n-1这个区间贪心的选择去掉最左和最右后的最小值,实际上好像不行……)
AC代码如下:
#include<cstring> #include<algorithm> #include<cmath> #include<iostream> #include<queue> #include<cstdio> #include<set> #include<vector> #define MAXN 100005 #define MOD 1000000 using namespace std; typedef long long ll; int t,n; ll s[2005]; ll dp[2005][2005]; int main(){ scanf("%d",&n); for(register int i=0;i<n;++i){ scanf("%lld",&s[i]); } sort(s,s+n); for(register int k=1;k<n;++k) for(register int l=0;l<n;++l){ int r=l+k; if(r<n){ dp[l][r]=min(dp[l+1][r],dp[l][r-1])+s[r]-s[l]; } } printf("%lld\n",dp[0][n-1]); return 0; }
Codeforces Round #715 (Div. 2)(A~C)(dp)
标签:区间贪心 mem doc ref get algo ++ str 奇数
原文地址:https://www.cnblogs.com/mikku39/p/14670539.html