A. Jzzhu and Children
把a[i]/m取上确界,找到最大的,如果相等则找最后一个。
#include<iostream>
#include<cstdio>
using namespace std;
int a[102];
int main(){
int n,m;
cin>>n>>m;
int tn=n;
for(int i=0;i<n;i++){
cin>>a[i];
a[i]=(a[i]+m-1)/m;
}
int tmax=-1,ans;
for(int i=0;i<n;i++)
if(a[i]>=tmax)
tmax=a[i],ans=i;
cout<<ans+1<<endl;
return 0;
}
B. Jzzhu and Sequences
按照他给的公式,f[i+1]=f[i]-f[i-1]。可计算得是6个数的循环:x,y,y-x,-x,-y,-y+x,...
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
int main(){
LL x,y,n;
cin>>x>>y>>n;
n+=5;
n%=6;
LL ans;
if(n==0)
ans=x;
if(n==1)
ans=y;
if(n==2)
ans=y-x;
if(n==3)
ans=-x;
if(n==4)
ans=-y;
if(n==5)
ans=-y+x;
LL MOD=1e9+7;
cout<<(ans%MOD+MOD)%MOD<<endl;
return 0;
}
C. Jzzhu and Chocolate
贪心可得4种情况:假设n>m,
如果k>n-1+m-1说明切不了;
如果k>n-1说明n,m都要切;
k>m-1说明只切n(贪心,切了m必小);
否则在切n和切m中选最优的。
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
//n*m切k次,最小的一块最大为多少?
int main(){
LL n,m,k,ans;
cin>>n>>m>>k;
if(n+m-2<k){
cout<<"-1"<<endl;
return 0;
}
if(n<m) swap(n,m);
if(k>n-1){//横竖都切
k-=n-1;//n切满
ans=(m/(k+1));
cout<<ans<<endl;
}
else if(k>m-1){
ans=n/(k+1);
cout<<ans*m<<endl;
}
else{
ans=max((n/(k+1))*m,(m/(k+1))*n);
cout<<ans<<endl;
}
return 0;
}
D题我用dijkstra算法,但一直wa,可能题意理解有偏差。改天再补