传送门
题意:判断n多边形是否同时有平行于x轴和y轴的边;
题解:不难发现4*k=n的多边形都满足,其余均不满足;
#include
#include
#include
using namespace std;
int main()
{
int t,n;
cin>>t;
while(t--){
cin>>n;
if(n%4==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
传送门
题意:一个二进制的字符串,现在你可以将10的子串删除其中任意一个,使得最后剩下的字符个数最少,且最小(如果我们有两个字符串x和y同样的长度x在字典上比y如果有职位i使.x1=y1, x2=y2,…, xi−1=yi−1和xi
所以我们可以分别从后往前遍历遇到0就停下来,再从前往后遍历遇到1就停下来最后得到的结果为答案的倒序。
#include
#include
#include
using namespace std;
string s;
int main()
{
int t,n;
cin>>t;
while(t--){
cin>>n>>s;
int p=1;
string ans;
for(int i=s.size()-1;i>=0;i--)
if(s[i]=='0'){ ans+="0";
p=i;
break; }
//从后往前遍历遇到0退出
else if(s[i]=='1') ans+="1";
for(int i=0;i<p;i++)
if(s[i]=='0') ans+="0";
else break;
//从前往后遍历遇到1退出
for(int i=ans.size()-1;i>=0;i--) cout<<ans[i];
//倒序输出答案
cout<<endl;
}
return 0;
}
传送门
题意:有n个整数,k个人,每个人需要得到几个整数已确定,现在要把n个整数按照要求全部分给k个人,然后计算k个人的总幸福值(每个人得到的最大整数与最小整数之和为他的幸福值)
题解:首先把k个最大值按照k个要求从大到小分配给k个从小到大的需求个数的人手中;然后再把剩下的整数按照同样的方法分配给每个人即可
#include
#include
#include
using namespace std;
const int N=200010;
int t,n,k;
int a[N],w[N],s[N];
long long int sum=0;
int main()
{
scanf("%d",&t);
while(t--){
memset(s,0,sizeof s);
sum=0;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<k;i++) {
scanf("%d",&w[i]);
w[i]--;
//先给每一个人分配了一个最大值,所以减1
}
sort(a,a+n);//给整数排序
sort(w,w+k);//给k个要求排序
int z=0,i=n-1;
for(i;i>=0;i--) if(z<k) s[z++]=a[i];
//先把最大值分配出去
i=n-z-1;//记录剩下的最大值下标
for(int j=0;j<k;j++) {
if(w[j]==0) s[j]+=s[j];
//如果为0则说明最大值最小值都是自己
else {
i=i-w[j];
s[j]+=a[i+1];
}
//分配w[j]个剩余最大整数给他,并加上最小值
}
for(int i=0;i<k;i++) sum+=s[i];
//把所有人的幸福值相加
cout<<sum<<endl;
}
return 0;
}
传送门
找规律即可,上代码
#include
using namespace std;
#define N 2000005
#define ll long long
#define mod 1000000007
int i,T,n,x;ll ans[N];
int main(){
cin>>T;
ans[3]=ans[4]=4;
for(i=5;i<N;++i){
ans[i]=ans[i-1]+ans[i-2]*2+(i%3==0)*4;ans[i]%=mod;
}
while(T--){
cin>>x;cout<<ans[x]<<"\n";
}
}