A.FashionabLee(思维题)
解题思路:以正四边形为基础,首先正方形时x轴平行边和y轴平行边之间直接连接,边数大于4时,把x轴平行边和y轴平行边拿开,观察将它们再次连接需要几条边就补几条边,此时得到的多边形必定满足条件,容易推知,构成8边形时恰好补四条边,补八条边构成12边形,每次补4条边,容易推知4的倍数即可满足
ac code:
#include<iostream>
using namespace std;
int main()
{
int n,t;
cin>>t;
while(t--){
cin>>n;
if(n%4==0)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B. AccurateLee(思维题)
思路:找最小位置的1和最大位置的0之间的值都可以删除
参考这篇博文写的比较好
#include<iostream>
#include<string>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int main()
{
int n,t;
cin>>t;
string s;
while(t--){
cin>>n;
cin>>s;
int p1=INF,p2=-1;
for(int i=0;i<n;i++){if(s[i]=='1')p1=min(p1,i);if(s[i]=='0')p2=max(p2,i);}
if(p1>=p2){cout<<s<<endl;continue;}
for(int i=0;i<p1;i++)cout<<s[i];
for(int i=p2;i<n;i++)cout<<s[i];//直接打印有效部分
cout<<endl;
}
return 0;
}
我开始是用的string迭代器来删除中间元素,但是不行,数据都没法全部输入完,按理来说迭代器不应该更快吗?后来上网查了一下迭代器和for循环的效率比较才知道,for循环便于访问顺序存储记录,迭代器便于访问链接存储,所以迭代器不能滥用呀,还是太菜了,基础知识掌握的还不够,下面是效率比较我参考的博文:
添加链接描述
C. RationalLee(思维题)
思路:k=1时特判,将最大值赋给它,于是得到2倍最大值,剩下的赋值都是当前剩下数中最大值加上最小值,使得其和尽可能大,注意k>1时将当前最小值给它以后要记得跳过此时最大值和最小值以外剩下将k填满的数
(按理说这样应该没问题,但我老是wa在test2,why??求赐教,多谢多谢)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn=2*1e5+3;
ll a[maxn],w[maxn];
int main()
{
memset(a,0,sizeof(a));
memset(w,0,sizeof(w));
ll n,k,t;
cin>>t;
while(t--){
cin>>n>>k;
for(int i=0;i<n;i++){cin>>a[i];}
for(int i=0;i<k;i++){cin>>w[i];}
sort(a,a+n);
sort(w,w+k);
ll p1=0,p2=n-1,sum=0;
for(int i=0;i<k;i++){
if(w[i]==1)sum+=2*a[p2--];
else{sum+=(a[p1]+a[p2--]);p1+=w[i]-1;} //要保证第i个朋友取得w[i]个数,记得跳过中间数
}
cout<<sum<<endl;
}
return 0;
}