A. New Building for SIS
模拟题 Wa了几发 心态容易崩 哈哈
#include <cstdio>
#include <cstring>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <sstream>
using namespace std;
long long Abs(int x){
if(x<0) return -x;
else return x;
}
int main(){
long long n,h,a,b,k;
scanf("%lld%lld%lld%lld%lld",&n,&h,&a,&b,&k);
while(k--){
long long k_1,k_2,k_3,k_4;
long long ans=0;
scanf("%lld%lld%lld%lld",&k_1,&k_2,&k_3,&k_4);
if(k_1!=k_3) {
if(k_2<a&&k_4<a) ans+=2*a-k_2-k_4;
else if(k_2>b&&k_4>b) ans+=k_2+k_4-2*b;
else ans+=Abs(k_2-k_4);
ans+=Abs(k_1-k_3);
printf("%lld\n",ans);
}
else printf("%I64d\n",Abs(k_2-k_4));
}
return 0;
}
B. Badge
跟着去模拟一下就好了
#include <cstdio>
#include <cstring>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <sstream>
using namespace std;
const int MAX_N = 1024;
int num[MAX_N];
int p[MAX_N];
int ans[MAX_N];
int main(){
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++){
scanf("%d",&p[i]);
}
for(int i = 1;i<=n;i++){
memset(num,0,sizeof(num));
num[i]++;
int cnt = i;
while(num[cnt]<2){
cnt=p[cnt];
num[cnt]++;
}
ans[i] = cnt;
}
for(int i = 1;i<=n;i++)
i==n?printf("%d\n",ans[i]):printf("%d ",ans[i]);
return 0;
}
C
先枚举一遍可能得到的票数 取min就好了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
//#define dbg(x) cout<<#x<<" = "<< (x)<< endl
const int MAX_N = 10024;
struct node {
int x;
int y;
bool operator < (const node other) const{
if(y==other.y) return x<other.x;
return y < other.y;
}
}arr[MAX_N];
int num[MAX_N];
int p[MAX_N];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1;i<=n;++i){
scanf("%d%d",&arr[i].x,&arr[i].y);
num[arr[i].x]++;
}
sort(arr+1,arr+1+n);
int sum = 0;
long long ans,minn = 1e18;
for(int i=num[1];i<=n;i++){
//dbg(i);
ans = 0;
sum = 0;
for(int j = 2;j<=m;j++){
if(num[j]>=i) {
p[j] = num[j]-i+1;
// dbg(p[j]);
sum+=p[j];
}
else p[j] = 0;
}
if(sum>(i-num[1])) continue;
sum = i-num[1]-sum;
// dbg(sum);
for(int k = 1;k<=n;k++){
//dbg(sum);
if(p[arr[k].x]){
ans+=arr[k].y;
//dbg(arr[k].y);
// dbg(ans);
p[arr[k].x]--;
//sum--;
}
else if(sum&&arr[k].x!=1){
//dbg(arr[k].y);
ans+=arr[k].y;
//dbg(ans);
sum--;
}
}
//dbg(ans);
minn=min(minn,ans);
}
printf("%I64d\n",minn);
return 0;
}
D The hat
交互题 题意问你给你一个圆圈的人啊 每个人都有数字卡片 问你有没有两个人卡片相同 输入一个数字 ?代表是第几个人拿这张卡片
我们可以构造函数f[x] -f[x+n/2] 发现他在1 到n/2具有连续单调性 那么就可以用二分啦
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
int n;
const int MAX_N = 100024;
long long f[MAX_N];
void in(int x){
printf("? %d\n",x);
fflush(stdout);
int m,y;
scanf("%d",&m);
printf("? %d\n",x+n/2);
fflush(stdout);
scanf("%d",&y);
f[x] = y - m;
}
int main(){
scanf("%d",&n);
in(1);
int l = 1,r = n/2;
if(f[1]==0) {
printf("! 1\n");
fflush(stdout);
return 0;
}
while(l<=r){
int mid = (l+r)>>1;
in(mid);
if(f[mid]==0) {
printf("! %d\n",mid);
fflush(stdout);
return 0;
}
else if(f[mid]>0){
if(f[1]>0){
l = mid + 1;
}
else r = mid - 1;
}
else {
if(f[1]>0){
r = mid - 1;
}
else l = mid + 1;
}
}
printf("! -1\n");
fflush(stdout);
return 0;
}
E抽空补题吧