A. Water Buying
水题 区分一下奇偶和价格就好。
#include<bits/stdc++.h>
using namespace std;
#define lld %I64d
#define REP(i,k,n) for(int i=k;i<n;i++)
#define REPP(i,k,n) for(int i=k;i<=n;i++)
#define mst(a,k) memset(a,k,sizeof(a))
#define LL long long
#define N 300005
#define mod 1000000007
#define INF 0x3f3f3f3f
#define pii pair<int,int>
#define mpa make_pair
inline LL read(){LL s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}
int main()
{
int q=read();
while(q--)
{
LL n=read(),a=read(),b=read();
if(b/2>=a)
printf("%lld\n",n*a);
else
{
if(n%2==0)
printf("%lld\n",b*(n/(LL)2));
else
printf("%lld\n",(n-1)/(LL)2*b+a);
}
}
}
B. Tanya and Candies
前缀和水题
一个序列,删去一个数值之后,要求剩下序列奇数和偶数的和相同,问有多少种删法。
看到这种序列和的题目第一反应就是前缀和。
处理方式就是:pre[i]=pre[i-1]+(i&1?a[i]:-a[i]);
#include<bits/stdc++.h>
using namespace std;
#define lld %I64d
#define REP(i,k,n) for(int i=k;i<n;i++)
#define REPP(i,k,n) for(int i=k;i<=n;i++)
#define mst(a,k) memset(a,k,sizeof(a))
#define LL long long
#define N 300005
#define mod 1000000007
#define INF 0x3f3f3f3f
#define pii pair<int,int>
#define mpa make_pair
inline LL read(){LL s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}
int a[N],pre[N];
int main()
{
int n=read();
pre[0]=0;
REPP(i,1,n)
{
scanf("%d",&a[i]);
pre[i]=pre[i-1]+(i&1?a[i]:-a[i]);
}
int ans=0;
REPP(i,1,n)
{
if(pre[i-1]==pre[n]-pre[i])
ans++;
}
printf("%d\n",ans);
}
C. Palindromic Matrix
神奇模拟题
先考虑一维的情况。若是n为偶数,那么数列中所有出现的数出现次数都为偶数。若是n为奇数,那么数列中所有出现的数中,恰有一个出现次数为奇数。
二维的话就是4的倍数。
说起来很简单,但是模拟过程就是神仙模拟。
#include<bits/stdc++.h>
using namespace std;
#define lld %I64d
#define REP(i,k,n) for(int i=k;i<n;i++)
#define REPP(i,k,n) for(int i=k;i<=n;i++)
#define mst(a,k) memset(a,k,sizeof(a))
#define LL long long
#define mod 1000000007
#define INF 0x3f3f3f3f
#define pii pair<int,int>
#define mpa make_pair
inline LL read(){LL s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}
const int MAXN = 1e3+10;
int sum[MAXN];
int ans[50][50];
int n, num;
int main()
{
scanf("%d", &n);
int N = n*n, x;
for(int i = 1; i <= N; i++){
scanf("%d", &x);
sum[x]++;
}
int flag = true;
int mid = (n+1)/2;
int num = 1;
if(n%2 == 0){
for(int i = 1; i <= mid; i++){
for(int j = 1; j <= mid; j++){
for(; num <= 1000; num++){
if(sum[num]){
if(sum[num]%4){
flag = false;
break;
}
ans[i][j] = ans[i][n-j+1] = ans[n-i+1][j] = ans[n-i+1][n-j+1] = num;
sum[num]-=4;
break;
}
}
if(num > 1000) flag = false;
if(!flag) break;
}
if(!flag) break;
}
}
else{
flag = true;
num = 1;
for(; num <= 1000; num++){
if(sum[num]%2){
ans[mid][mid] = num;
sum[num]--;
break;
}
}
if(num > 1000){
flag = false;
//puts("zjy");
}
else{
num = 1;
for(int i = 1; i < mid; i++){
for(int j = 1; j < mid; j++){
for(; num <= 1000; num++){
if(sum[num] == 0) continue;
if(sum[num]/4 < 1) continue;
ans[i][j] = ans[i][n-j+1] = ans[n-i+1][j] = ans[n-i+1][n-j+1] = num;
sum[num]-=4;
break;
}
if(num > 1000) flag = false;
if(!flag) break;
}
if(!flag) break;
}
num = 1;
for(int i = 1; i < mid; i++){
for(; num <= 1000; num++){
if(sum[num]/2 >= 1){
ans[mid][i] = ans[mid][n-i+1] = num;
sum[num]-=2;
break;
}
}
if(num > 1000){flag = false; break;}
}
num = 1;
for(int i = 1; i < mid; i++){
for(; num <= 1000; num++){
if(sum[num]/2 >= 1){
ans[i][mid] = ans[n-i+1][mid] = num;
sum[num]-=2;
break;
}
}
if(num > 1000){flag = false; break;}
}
}
}
if(!flag) puts("NO");
else{
puts("YES");
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++)
printf("%d ", ans[i][j]);
puts("");
}
}
return 0;
}