2020年“远光杯”粤澳计算机程序设计大赛网络资格赛 题解2
由于题目太多分成两篇文章总结,这一篇是前 1 至 10题。
加上代码头文章太长,所以把模板放在最后。
如果有什么讲的不清楚的欢迎留言私信交流~
思路:模拟就好,讲讲坑点:
代码:
const int manx=1e6+5;
ll day[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
bool pdsb(string s){
if(s.size()!=8) return true;
for(int i=0;i<s.size();i++){
if(s[i]<='9'&&s[i]>='0') continue;
else return true;
}
ll year=0,mon=0,da=0;
for(int i=0;i<4;i++) year=year*10+(s[i]-'0');
if(year<1900||year>2020) return true;
for(int i=4;i<6;i++) mon=mon*10+(s[i]-'0');
if(mon<1||mon>12) return true;
for(int i=6;i<8;i++) da=da*10+(s[i]-'0');
ll sb=day[mon];
if(mon==2 && (year%400==0||(year%4==0&&year%100))) sb++;
if(da<1||da>sb) return true;
return false;
}
bool pds(string s){
for(int i=0;i<s.size();i++){
if(s[i]<='z'&&s[i]>='a') continue;
else if(s[i]<='Z'&&s[i]>='A') continue;
else if(s[i]==' ') continue;
else return true;
}
return false;
}
int main(){
string sb,s;
while(cin>>sb){
ll k=0;
getchar(); getline(cin,s);
if(pdsb(sb)||pds(s)){
cout<<"none"<<endl;
continue;
}
for(int i=0;i<sb.size();i++) k+= sb[i]-'0';
while(k>=10){
ll x=0;
while(k){
x+=k%10; k/=10;
}
k=x;
}
ll n=s.size();
for(int i=0;i<n;i++){
if(s[i]==' ') cout<<'#';
if(s[i]>='a'&&s[i]<='z'){
cout<<
(char)(((s[i]-'a'+k)%26)+'a')
;
}
if(s[i]>='A'&&s[i]<='Z'){
cout<<
(char)(((s[i]-'A'+k)%26)+'A')
;
}
}
cout<<endl;
}
return 0;
}
思路:模拟就好,注意判断每一年是否是闰年,然后一年一年减下去就可以。
代码:
ll day[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
ll a,b,c,s;
void pd(ll a){
if(a%4==0&&a%100){
s-=day[2]; day[2]=29; s+=day[2];
}
else if(a%400==0){
s-=day[2]; day[2]=29; s+=day[2];
}
else{
s-=day[2]; day[2]=28; s+=day[2];
}
}
void cal(){
ll cnt=0;
for(int i=1;i<b;i++) cnt+=day[i];
cnt+=c;
--a;
while(a>=2000){
pd(a);
cnt+=s;
a--;
}
ll d=cnt/4;
if(cnt%4) d++;
cout<<d<<" ";
if(cnt%4==1) cout<<1<<endl;
else if(cnt%4==2) cout<<2<<endl;
else if(cnt%4==3) cout<<3<<endl;
else cout<<4<<endl;
}
int main(){
for(int i=1;i<=12;i++) s+=day[i];
while(cin>>a>>b>>c){
pd(a);
cal();
}
return 0;
}
思路:map统计单词出现次数,判断出现次数为1的单词是否大于n/2。
代码:
map<string,ll>vis;
int main(){
string s;
while(1){
getline(cin,s);
if(s[0]=='#') break;
vis.clear();
ll cnt=1;
ll k=0;
// cout<
for(int i=0;i<s.length();i++){
if(s[i]!=' ') continue;
string c="";
for(int j=k;j<i;j++)
c+=s[j];
vis[c]++; cnt++; k=i+1;
// cout<
}
string c="";
for(int j=k+1;j<s.size();j++)
c+=s[j];
vis[c]++; cnt++;
ll ans=0;
for(auto x: vis){
if(x.second==1) ans++;
}
// cout<
if(ans>=cnt/2) put1();
else put2();
}
return 0;
}
思路:对3取余然后分情况输出。
代码:
vector<ll>g[5];
int main(){
ll n; io; cin>>n;
//while(cin>>n){
g[1].clear(); g[2].clear(); g[3].clear();
for(int i=1;i<=n;i++){
ll x; cin>>x;
g[i%3].pb(x);
}
for(int i=1;i<3;i++){
for(int j=0;j<g[i].size();j++)
cout<<g[i][j]<<" ";
cout<<endl;
}
for(int j=0;j<g[0].size();j++)
cout<<g[0][j]<<" ";
cout<<endl;
//}
return 0;
}
思路:
代码:
思路:
代码:
思路:map统计出现次数最多的即可。
代码:
map<ll,ll>vis;
int main(){
io;
ll n; cin>>n; ll ans=0,res=0;
for(int i=1;i<=n;i++){
ll x; cin>>x;
vis[x]++;
if(vis[x]>res) res=vis[x],ans=x;
}
cout<<ans<<endl;
return 0;
}
思路:
代码:
思路:期末考试题,结构体存各科分数+总分,然后按总分排序。
代码:
struct node{
ll id;
ll b,c,d;
ll s;
}a[manx];
bool cmp(node a,node b){
if(a.s==b.s){
if(a.b==b.b) return a.id<b.id;
return a.b>b.b;
}
return a.s>b.s;
}
int main(){
ll n; io; cin>>n;
for(int i=1;i<=n;i++){
a[i].id=i;
cin>>a[i].b>>a[i].c>>a[i].d;
a[i].s=a[i].b+a[i].c+a[i].d;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=5;i++){
cout<<a[i].id<<" "<<a[i].b<<" "<<a[i].c<<" "<<a[i].d<<endl;
}
return 0;
}
思路:旋转90° 其实只是把相隔1位的元素互换位置,重复三次即可。
代码:
char c[10];
ll ans,ans1,ans2,ans3;
ll lg[10];
ll pd(){
ll x=0;
for(int k=1;k<=8;k++){
x+= ( (c[9]-'0')^(c[k]-'0') )*lg[8-k];
}
return x;
}
int main(){
ll n; cin>>n;
lg[0]=1;
for(int i=1;i<=10;i++) lg[i]=lg[i-1]*2;
while(n--){
ans=ans1=ans2=ans3=0;
cin>>c[1]>>c[2]>>c[3]>>c[8]>>c[9]>>c[4]>>c[7]>>c[6]>>c[5];
ans=pd();
char x=c[1];
swap(c[3],c[5]); swap(c[3],c[7]); swap(c[1],c[3]);
swap(c[2],c[4]); swap(c[2],c[6]); swap(c[2],c[8]);
ans1=pd();
swap(c[3],c[5]); swap(c[3],c[7]); swap(c[1],c[3]);
swap(c[2],c[4]); swap(c[2],c[6]); swap(c[2],c[8]);
ans2=pd();
swap(c[3],c[5]); swap(c[3],c[7]); swap(c[1],c[3]);
swap(c[2],c[4]); swap(c[2],c[6]); swap(c[2],c[8]);
ans3=pd();
ans=min(ans,ans1); ans=min(ans,ans2); ans=min(ans,ans3);
cout<<ans<<endl;
}
return 0;
}
#include
#define mp make_pair
#define pb push_back
#define ll long long
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define io std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
inline ll read(){
ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
void put1(){
puts("Yes") ;}void put2(){
puts("No") ;}void put3(){
puts("-1"); }
ll qp(ll a,ll b, ll p){
ll ans = 1;while(b){
if(b&1){
ans = (ans*a)%p;--b;}a =
(a*a)%p;b >>= 1;}return ans%p;}
const int mo=998244353; const int mod=1000000007;
const int manx=1e6+5;
int main(){
return 0;
}