喵哈哈村的魔法考试 Round #13 (Div.2) 题解
2017-04-11 19:17
537 查看
喵哈哈村的木星传说(一)
旋转90°,找找规律就知道(x,y)->(n-1-y,x)然后输出就好了。
#include<bits/stdc++.h> using namespace std; const int maxn = 55; int n,mp[maxn][maxn]; int main(){ while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++) cin>>mp[i][j]; } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(j==0){ cout<<mp[n-1-j][i]; }else{ cout<<" "<<mp[n-1-j][i]; } } cout<<endl; } } }
喵哈哈村的木星传说(二)
考虑每一个字符串,我们观察知道字符串的字母顺序实际上是没有关系的。那么我们首先将字符串内的字符排序,然后再看看一共有多少种字符串就好了。
#include<bits/stdc++.h> using namespace std; set<string> S; int n; int main(){ while(cin>>n){ S.clear(); for(int i=0;i<n;i++){ string s; cin>>s; sort(s.begin(),s.end()); S.insert(s); } cout<<S.size()<<endl; } }
喵哈哈村的木星传说(三)
考虑dp[i][j]表示左边选了i个,右边选了j个dp的最大值。那么dp[i][j]就可以从dp[i-1][j],dp[i][j-1]转移过来。
然后输出最大的就好了。
#include<bits/stdc++.h> #include<iostream> #include<cstdio> using namespace std; int f[2005][2005]; int n,a[2005],ans=0; int main() { while(scanf("%d",&n)!=EOF){ memset(f,0,sizeof(f)); ans = 0; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=0;i<=n;i++) for(int j=0;j<=n-i;j++) f[i+1][j+1]=max(f[i][j+1]+(i+j)*a[i],f[i+1][j]+(i+j)*a[n-j+1]); for(int i=0;i<=n;i++)ans=max(ans,f[i+1][n-i+1]); printf("%d\n",ans); } return 0; }
喵哈哈村的木星传说(四)
首先行走的路线,贪心可以直到显然是(n>m)(0,0)->(1,0)->(2,0)->....->(n,0)->(n,1)->(n,2)->...->(n,m)这样走。然后整理一下公式,发现答案 = n + C(n+m+1,m),然后C(n+m+1,m)这个用lucas做出来就好。
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define P 1000000007 #define ll long long using namespace std; inline ll read() { ll x=0;char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x; } ll n,m; ll qpow(ll a,ll b) { ll ans=1; for(ll i=b;i;i>>=1,a=(a*a)%P) if(i&1)ans=ans*a%P; return ans; } ll C(ll a,ll b) { if(b>a)return 0; if(b>a-b)b=a-b; ll s1=1,s2=1; for(ll i=1;i<=b;i++) { s1=s1*(a-i+1)%P; s2=s2*i%P; } return s1*qpow(s2,P-2)%P; } ll lucas(ll a,ll b) { return C(a/P,b/P)*C(a%P,b%P); } int main() { while(cin>>n>>m){ //n=read();m=read(); printf("%lld\n",(lucas(n+m+1,min(n,m))+max(n,m))%P); } return 0; }
喵哈哈村的木星传说(五)
这是一道数学题。。。我们来举个例子:有一条边R从x指向y,它的数值大于0,AB对弈,现在A走
{
那么如果数值为1,A走过去,数值变为0,B就走不回来了
如果数值为2,A走过去,数值变为1,如果B走回来,A不就死了?我们认为他们都足够聪明(虽然没有最强大脑聪明),怎么会做这么逗比的事情呢?(假设过来的前一条边已经走完了,数值为0)
如果数值大于3(我们假定为3),A走过去,数值变为2,B如果仁慈地走回来,数值变为1,这样不就浪费了一步?
B如果按照题意残忍地用最佳行动走回来,取光所有数值,那么数值变为0,这条路就封死了,A做了一件无意义的事情,还封死了自己可以走的一条路,这对于先手的A而言是不利的,
这两种方法都明显有违双方最优的前提。
}
★★★所以我们可以知道,无论是A走还是B走,即无论是先手走还是后手走,每走过一条路都一定取完,这样问题就简单了★★★
因为至少有个0,所以就简单了一点。。谁把对手逼到死路(两边都是0的)就赢了
从起始点开始向两边找,只要有一边到0边距离为奇数就是先手赢反之后手赢
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<set> #include<queue> #include<map> #define pa pair<int,int> #define inf 1000000000 #define ll long long using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,l,r; int a[50]; int main() { while(cin>>n) { l=0; r=n; for(int i=1;i<=n;i++)a[i]=read(); while(a[l+1])l++; while(a[r])r--; r=n-r; if(l&1||r&1)puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- 喵哈哈村的魔法考试 Round #15 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #14 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #19 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #18 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #20 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)
- 喵哈哈村的魔法考试 Round #10 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #12 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #9 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #2 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #5 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #11 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #1 (Div.2) C 喵哈哈村的魔法石(II) 背包dp
- 喵哈哈村的魔法考试 Round #3 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #5 (Div.2) ABCC2
- 喵哈哈村的魔法考试 Round #7 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #8 (Div.2) 题解
- 喵哈哈村的魔法考试 Round #1 (Div.2) ABCD
- 喵哈哈村的魔法考试 Round #3 (Div.2) ABCDE