题意老师提问问题,(1,1)表示第一排第一个。
(1,1)(1,2)(1,3)……(1,4)(1,5)
……
(n,1)(n,2)(n,3)……(n,n-1)(n,n)
(n-1,1)(n-1,2)(n-3,3)……(n-1,n-1)(n-1,n)
然后这么提问,问谁回答的最多,谁回答的最少,第(x,y)回答了多少
问题数是 1e18
座位长宽范围100以内
思路首先,不能用暴力模拟,1e18我以前搞过这类的题目,就是用余数来模拟,之前的循环都是一样的,就是找循环来模拟。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL k;
LL a[110][110];
int main()
{
LL n , m , x , y , yu , sha , sum ,ans , Max;
scanf("%I64d %I64d %I64d %I64d %I64d",&n , &m , &k , &x , &y);
if(n > 2)
sum = 2 * n * m - 2 * m;
else
sum = n * m;
yu = k % sum , sha = (k / sum);
LL tmp = yu;
//printf("sum = %I64d yu = %I64d\n",sum,yu);
int row = 1 , lie = 1 ;
for(int i = 1 ; i <= n && yu > 0 ; i++){
for(int j = 1 ; j <= m && yu > 0 ; j++){
a[i][j]++,yu--,ans++;
}
}
for(int i = n - 1 ; i > 1 && yu > 0 ; i--){
for(int j = 1 ; j <= m && yu > 0 ; j++){
a[i][j]++,yu--,ans++;
}
}
//printf("ans = %I64d\n",ans);
Max = -1;
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= m ; j++){
if(a[i][j] > Max) Max = a[i][j];
}
}
//printf("Max = %I64d\n",Max);
if(n > 2){
//printf("yu = %I64d m = %I64d\n",yu,m);
if(tmp > m){
printf("%I64d ", Max + 2*sha);
}
else
printf("%I64d ",max(2*sha,Max));
}
else printf("%I64d ", Max + sha);
printf("%I64d",a[n][m] + sha);
if(n <= 2){
printf(" %I64d\n",a[x][y] + sha);
}
else{
if(x > 1 && x < n){
printf(" %I64d\n",a[x][y] + sha * 2);
}
else{
printf(" %I64d\n",a[x][y] + sha);
}
}
return 0;
}
昨天心态爆炸,我本以为我不会喜欢令我感觉很操蛋的人。。。。。。
but。。。。。
今天上午两个dp不会,。。。。看题解也看不懂,智商捉急。