11.8
rigou阿,刚才都写好了结果手贱给关了,还tm没包存。
第一题,水题,注意处理零的情况,不用unsigned也能过,我反正没用。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1<<64
long long a[100];
int main(){
int T,n,flag=0,k;
long long ans;
long long tmp,x;
scanf("%d",&T);
/* ans=1;
flag=0;
tmp=-1000000000;
*/
while(T--){
ans=1;
flag=0;
k=0;
int zero=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld",&x);
if(x>0){
flag=1;
ans*=x;
}
else if(x<0){
a[k++]=-x;
}
else {
zero=1;
}
}
sort(a,a+k);
for(int i=k-1;i>=0;i-=2){
if(i-1>=0) {
ans*=a[i];
ans*=a[i-1];
flag=1;
}
else break;
}
if(flag==1) {
if(zero==1&&ans<0) ans=0;
printf("%lld\n",ans);
}
else{
if(zero==1) printf("0\n");
else
printf("-%lld\n",a[0]);
}
}
}
第二题,一开始想到的是搜索,但是好像会超时,因为他说n每次更新之后因子的也会发生变化,每次都重新求一边,想想就很费劲。
然后观察了一下,首先m%n一定要等于零,否则不可能变过去,然后,(瞄了一眼discuss,发现好像大体思路差不多,每次更新n用的是n和m/n的最大公约数,因为要求最少几步,然后每次都判断能不能变化。这里有个疑问为什么每次都要选gcd,其实仔细想一下,你选个其他的只有比gcd小的了,不能满足最少变化。所以,,,
注意这次要用unsigned。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1<<64
long long a[100];
int main(){
int T,n,flag=0,k;
long long ans;
long long tmp,x;
scanf("%d",&T);
/* ans=1;
flag=0;
tmp=-1000000000;
*/
while(T--){
ans=1;
flag=0;
k=0;
int zero=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld",&x);
if(x>0){
flag=1;
ans*=x;
}
else if(x<0){
a[k++]=-x;
}
else {
zero=1;
}
}
sort(a,a+k);
for(int i=k-1;i>=0;i-=2){
if(i-1>=0) {
ans*=a[i];
ans*=a[i-1];
flag=1;
}
else break;
}
if(flag==1) {
if(zero==1&&ans<0) ans=0;
printf("%lld\n",ans);
}
else{
if(zero==1) printf("0\n");
else
printf("-%lld\n",a[0]);
}
}
}