南昌大学航天杯第二届程序设计竞赛校赛网络同步赛(回顾补题)
作者:互联网
这次比赛4/9,当时比完没有及时补题,现在补上
模拟
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main()
{
string s1;
while(cin>>s1)
{
for(int i=0;i<s1.size();i++)
{
if(s1[i]>='A'&&s1[i]<='Z')
s1[i]+=32,cout<<s1[i];
else
{
if(s1[i]>='a'&&s1[i]<='z')
s1[i]-=32,cout<<s1[i];
else
cout<<s1[i];
}
}
cout<<endl;
}
return 0;
}
看似是博弈论,实际上可以使用递推,求出所有的必胜点和必败点,然后标记查询即可。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
bool vis[300];
void init()
{
int sum1=2,sum2=4,sum3=6,sum4=10,sum5=12,sum6=18;
vis[1]=vis[3]=vis[5]=vis[7]=vis[9]=true;
for(int i=10;i<=200;i++)
{
bool flag=false;
int sum=0,j=i;
if(j>sum1)
{
j-=sum1;
if(vis[j])
sum++;
}
j=i;
if(j>sum2)
{
j-=sum2;
if(vis[j])
sum++;
}
j=i;
if(j>sum3)
{
j-=sum3;
if(vis[j])
sum++;
}
j=i;
if(j>sum4)
{
j-=sum4;
if(vis[j])
sum++;
}
j=i;
if(j>sum5)
{
j-=sum5;
if(vis[j])
sum++;
}
j=i;
if(j>sum6)
{
j-=sum6;
if(vis[j])
sum++;
}
if(sum)
vis[i]=true;
else
vis[i]=false;
}
}
int main()
{
int n1,n2;
init();
while(cin>>n1>>n2)
{
int sum1=n1+n2;
if(vis[sum1])
cout<<"win\n";
else
cout<<"lose\n";
}
return 0;
}
找规律,当时怎么就没想到呢,可惜可惜
#include<bits/stdc++.h>
using namespace std;
int num[1011];
int main() {
int n;
while(~scanf("%d",&n)) {
num[1]=0;
num[2]=1;
num[3]=2;
num[4]=4;
for(int i=5;i<1006;i++)
num[i]=num[i-1]+i/2;
cout<<num[n]<<endl;
}
return 0;
}
当时比赛的时候疯狂写挂,现在用STL,一遍AC。STL真香。使用一个字符串表示之前操作,一个表示现在操作完的字符串记录,输出即可。
#include<bits/stdc++.h>
using namespace std;
stack<string> p;
int main() {
ios::sync_with_stdio(false);
int q;
while(cin>>q) {
string now1;
while(q--) {
int t;
cin>>t;
if(t==1) {
string temp;
cin>>temp;
p.push(now1);
now1=now1+temp;
}
if(t==2) {
int k;
cin>>k;
p.push(now1);
int len1=now1.size();
now1=now1.substr(0,len1-k);
}
if(t==3) {
int k;
cin>>k;
cout<<now1[k-1]<<endl;
}
if(t==4) {
now1=p.top();
p.pop();
}
}
while(!p.empty())
p.pop();
}
return 0;
}
大数取模,模拟即可
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
string N;
long long M,sum=0,S=0;
cin>>N>>M;
for(int i=0;i<N.size();i++)
{
sum=S*10+N[i]-'0';
S=sum%M;
}
long long sum1=0;
for(int i=2;i<=sqrt(S);i++)
{
if(S%i==0)
{
while(S%i==0)
S/=i;
sum1++;
}
}
if(S!=1)
sum1++;
cout<<sum1<<endl;
}
return 0;
}
这个,我觉得是个背包,但是两个数组的元素个数是任意个就行,只需要满足平均数相同,然后DFS,超时。看了下AC代码普遍都是GCD,希望来位大佬能解释一下。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=40;
int num[MAXN];
int n;
int sum1=0;
int main() {
int t;
while(~scanf("%d",&t)) {
while(t--) {
sum1=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&num[i]),sum1+=num[i];
if(__gcd(sum1,n)!=1)
puts("yes");
else
puts("no");
}
}
return 0;
}
初看以为是个递推公式,类似斐波那契,实际上是个循环数列,第一个出现的数字和二进制数相关。其数值就是二进制表示中1的个数,第一个这个数出现的项数就是
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
scanf("%d",&t);
while(t--) {
long long n,n1;
scanf("%lld",&n);
if(n==0) {
printf("0 0\n");
continue;
}
int sum=0;
while(n) {
if(n%2==1)
sum+=1;
n/=2;
}
n1=pow(2,sum)-1;
printf("%d %lld\n",sum,n1);
}
return 0;
}
模拟没什么好讲的,贴代码
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main()
{
long long begin1,end1;
while(cin>>begin1>>end1)
{
long long hh=0,mm=0,ss=0;
long long time1=end1-begin1;
hh=time1/3600;
mm=(time1-hh*3600)/60;
ss=(time1-hh*3600-mm*60);
if(hh>=10)
cout<<hh<<":";
else
cout<<"0"<<hh<<":";
if(mm>=10)
cout<<mm<<":";
else
cout<<"0"<<mm<<":";
if(ss>=10)
cout<<ss;
else
cout<<"0"<<ss;
cout<<endl;
}
return 0;
}
Ls_attack 发布了51 篇原创文章 · 获赞 1 · 访问量 6905 私信 关注
标签:int,sum,long,vis,while,补题,南昌大学,校赛,include 来源: https://blog.csdn.net/Ls_attack/article/details/104068971