Asu Coding Cup 4
文章目录
题目链接:http://codeforces.com/gym/102397
A. Bashar and SHAWERMA
Problem: 求2*x
Solution: 求2*x
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int x;
int main() {
scanf("%d",&x);
printf("%d",2*x);
return 0;
}
B. Calculate The Area
Problem: 给定矩形面积,求任意一组长宽
Solution: 1*n
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int n;
int main() {
scanf("%d",&n);
printf("%d %d",1,n);
return 0;
}
C. The Ending Point
Problem: ULDR坐标移动,给定起点求终点
Solution: ULDR坐标移动,给定起点求终点
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int x,y;
char s[105];
int main(){
scanf("%d%d",&x,&y);
scanf("%s",s);
for(int i=0;i<strlen(s);i++){
if(s[i]=='U') y++;
else if(s[i]=='D') y--;
else if(s[i]=='L') x--;
else if(s[i]=='R') x++;
}
printf("%d %d",x,y);
return 0;
}
D. Bashar and the bad land(Easy)(同E)
Problem: 给定n个一条线排列的房子的对应硬币数,求要获得K枚硬币最少移动多少次,起点自定
Solution: 总和>=k; 前缀和从头向右开始找,压缩左端
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000005;
int n,x,ans=maxn;
ll a[maxn],sum[maxn];
int main(){
scanf("%d%d",&n,&x);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
if(sum[n]<x) return cout<<-1,0;
int l=0,temp=maxn;
// for(int i=1;i<=n;i++) cout<<sum[i]<<" ";
// cout<<endl;
for(int r=1;r<=n;r++){
if(sum[r]-sum[l]>=x){
while(l<r){
if(sum[r]-sum[l+1]>=x) l++;
else break;
}
if(r==1+l) return cout<<1,0;
temp=r-l;
ans=min(ans,temp);
// cout<<l<<" "<<r<<" "<<temp<<" "<<ans<<endl;
}
}
printf("%d",ans);
return 0;
}
E. Bashar and the bad land(Hard)(同D)
Problem: 给定n个一条线排列的房子的对应硬币数,求要获得K枚硬币最少移动多少距离,起点自定
Solution: 总和>=k; 前缀和从头向右开始找,压缩左端
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000005;
int n,x,ans=maxn;
ll a[maxn],sum[maxn];
int main(){
scanf("%d%d",&n,&x);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
if(sum[n]<x) return cout<<-1,0;
int l=0,temp=maxn;
// for(int i=1;i<=n;i++) cout<<sum[i]<<" ";
// cout<<endl;
for(int r=1;r<=n;r++){
if(sum[r]-sum[l]>=x){
while(l<r){
if(sum[r]-sum[l+1]>=x) l++;
else break;
}
if(r==1+l) return cout<<1,0;
temp=r-l;
ans=min(ans,temp);
// cout<<l<<" "<<r<<" "<<temp<<" "<<ans<<endl;
}
}
printf("%d",ans);
return 0;
}
F. Weird Game
Problem: n蛋糕,每次可以选择吃1个或者吃一半数量个,二人博弈,剩1失败
Solution: 奇数后手赢,偶数先手赢
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int n;
int main() {
scanf("%d",&n);
if(n%2) printf("Bashar");
else printf("Mahmoud");
return 0;
}
G. Super Weird Game
Problem: 求i<j&&Ai+Aj=k 的(i,j)对数,根据对数判断胜负平
Solution: ans+=cnt[k-Ai]
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000005;
int t;
int n,k,m[maxn],b[maxn],cnt1[maxn],cnt2[maxn],ans1=0,ans2=0;
int main() {
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++) {
scanf("%d",&m[i]);
if(m[i]>k) continue;
else {
cnt1[m[i]]++;
ans1+=cnt1[k-m[i]];
}
}
for(int i=1; i<=n; i++) {
scanf("%d",&b[i]);
if(b[i]>k) continue;
else {
cnt2[b[i]]++;
ans2+=cnt2[k-b[i]];
}
}
// cout<<ans1<<" "<<ans2<<endl;
if(ans1>ans2) return cout<<"Mahmoud",0;
if(ans1==ans2) return cout<<"Draw",0;
return cout<<"Bashar",0;
}
H. Mahmoud and the flagstones
Problem: n个数能分成几个集合,相同数可合并成一个集合
Solution: 记录每个数出现次数, 每个数能分成2^cnt-1个集合
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int t;
int n,a[100005],mi=100005,mx=-1;
ll f[100005],ans=0,cnt[100005];
int main() {
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
cnt[a[i]]++;
mi=min(mi,a[i]);
mx=max(mx,a[i]);
}
f[1]=1;
for(int i=2;i<=100000;i++){
f[i]=((f[i-1]+1)*2-1)%mod;
}
for(int i=mi;i<=mx;i++){
if(cnt[i]){
ans=(ans+f[cnt[i]])%mod;
}
}
printf("%lld",ans);
return 0;
}
I. Dr.Hjjawi and the MCQ
Problem: 字符串求abcde中出现次数最多和最少
Solution: 字符串求abcde中出现次数最多和最少
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int n,cnt[5];
char s[1005];
int main() {
scanf("%d",&n);
scanf("%s",s);
for(int i=0;i<n;i++){
cnt[s[i]-'a']++;
}
sort(cnt,cnt+5);
printf("%d %d",cnt[0],cnt[4]);
return 0;
}
J. Abu Tabun and Flash Memories
Problem: n个文件,每个文件x GB,一个闪存能存a GB,每个文件不能分开,求至少需要多少闪存
Solution:
A
n
s
=
(
n
+
[
a
/
x
]
−
1
)
/
[
a
/
x
]
Ans=(n+[a/x]-1)/[a/x]
Ans=(n+[a/x]−1)/[a/x]
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int n,x,a;
int main() {
scanf("%d%d%d",&n,&x,&a);
int b=a/x;
printf("%d",(n+b-1)/b);
return 0;
}