我发这个坑在这,是为了催自己补题
A Alice and Bob[打表]
这道题,和别人的代码对了对觉得我和他写得几乎一模一样,结果人家A了我T了,只好打个表
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
const int N = 5e3+5;
int sg[N][N],n=5000,ans[N];
int walk()
{
for(int i = 0;i <= n; i++){
for(int j = 0;j <= n; j++){
if(sg[i][j]==0){
cout<<"ans["<<i<<"]="<<j<<";"<<endl;
ans[i]=j,ans[j]=i;
for(int u = 1;u+i <= n; u++){
for(int v = 0; j+u*v <= n; v++){
sg[i+u][j+u*v] = sg[j+u*v][i+u] = 1;
}
}
swap(i,j);
for(int u = 1;u+i <= n; u++){
for(int v = 0; j+u*v <= n; v++){
sg[i+u][j+u*v] = sg[j+u*v][i+u] = 1;
}
}
swap(i,j);
}
}
}
}
void Set();
int main(){
Set();
// freopen("1.txt","w",stdout);
// walk();
int t;
int a,b;
cin>>t;
while(t--){
cin>>a>>b;
if(ans[a]==b) cout<<"Bob\n";
else cout<<"Alice\n";
}
}
G Game of Swapping Numbers[贪心 思维]
在看题解的时候:
“分配
正负号”,很妙的想法
“构造最优解”,是,不错
“区间不交”,???
问了问后立刻懂了,把这道题理解成区间后就变得十分简单。这道题其实就是给你n个区间,左端点是
a
i
a_i
ai,右端点是
b
i
b_i
bi,让你交换k次区间的左端点,使得总区间的长度最长。
容易发现如果不这样取要么不会增加贡献,要么会减少。
接下来就是按照题解的思路写出的代码。
然而一开始n==2这里特判地不对,甚至等于没有特判,结果居然还是a了,这奇怪的数据
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const int N = 5e5+5;
int a[N],b[N];
int main(){
int n,k;
ll ans = 0;
cin>>n>>k;
vector<int> n1,n2; n1.resize(n);n2.resize(n);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
if(n == 2 ){
if(k%2 == 0) ans = abs(a[0]-b[0])+abs(a[1]-b[1]);
else ans = max(abs(a[0]-b[0])+abs(a[1]-b[1]),abs(a[0]-b[1])+abs(a[1]-b[0]));
cout<<ans;
return 0;
}
for(int i=0;i<n;i++){
n1[i]=max(a[i],b[i]);
n2[i]=min(a[i],b[i]);
ans += abs(a[i]-b[i]);
}
sort(n1.begin(),n1.end());
sort(n2.begin(),n2.end(),greater<int>());
for(int i=0;i<k&&i<n;i++){
if(n1[i]<n2[i]){
ans += 2*(n2[i]-n1[i]);
}
else break;
}
cout<<ans<<endl;
}
K Knowledge Test about Match[贪心乱搞]
当 随便打了一遍,本地没验证,代码交上去准备开始写km,结果直接过了:什么傻逼题
这场为啥这么多贪心,还有乱搞(#)并不是很喜欢乱搞的题,感觉很不讲道理。
是按照枚举差的方法写的,这不比H简单?…我太菜了
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const int N = 5e5+5;
int a[N],b[N];
int main(){
int T,n;
cin>>T;
while(T--){
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
multiset<int> num;
for(int i=0;i<n;i++) num.insert(a[i]),b[i]=-1;
for(int del=0;del<n;del++){
for(int i=0;i<n;i++){
if(b[i]==-1 && num.find(i-del)!=num.end()){
b[i]=i-del;
num.erase(num.find(i-del));
}else if(b[i]==-1 && num.find(i+del)!=num.end()){
b[i]=i+del;
num.erase(num.find(i+del));
}
}
// cout<<del<<": ";for(int i=0;i<n;i++) cout<<b[i]<<" \n"[i==n-1];
}
for(int i=0;i<n;i++) cout<<b[i]<<" \n"[i==n-1];
}
}
下楼吃个饭再继续看。。