【usaco】1.1
程序员文章站
2023-11-08 11:48:58
你的飞碟在这儿Your Ride Is Here(难度:入门难度) "题目链接" 题目大意 emmmm 输入两个字符串,问他们每个字母的asco码相乘后字符串是否相等。 思路 一道水题?(雾) 错误代码: cpp include include using namespace std; char s ......
你的飞碟在这儿your ride is here(难度:入门难度)
题目大意
emmmm 输入两个字符串,问他们每个字母的asco码相乘后字符串是否相等。
思路
一道水题?(雾)
错误代码:
#include<cstdio> #include<cstring> using namespace std; char s1[10],s2[10]; int main() { scanf(" %s %s", s1+1,s2+1); int len1=strlen(s1+1),len2=strlen(s2+1); int ans1=1,ans2=1; for(int i=1;i<=len1;i++) ans1*=(s1[i]-'a'+1)%47; for(int i=1;i<=len2;i++) ans2*=(s2[i]-'a'+1)%47; if(ans1==ans2) printf("go"); else printf("stay"); return 0; }
注意ans1和ans2最后没有%47,所以最后的答案全部输出stay,50分。
代码
#include<cstdio> #include<cstring> using namespace std; char s1[10],s2[10]; int main() { scanf(" %s %s", s1+1,s2+1); int len1=strlen(s1+1),len2=strlen(s2+1); int ans1=1,ans2=1; for(int i=1;i<=len1;i++) ans1*=((s1[i]-64)%47); for(int i=1;i<=len2;i++) ans2*=((s2[i]-64)%47); ans1%=47; ans2%=47; if(ans1==ans2) printf("go"); else printf("stay"); return 0; }
贪婪的送礼者greedy gift givers(难度:普及-)
题目大意
在一个聚会上,人们互相赠送钱,问聚会结束后每个人分别少了多少钱或多了多少钱。
思路
边读入边记录每个人的钱数,用结构体表示每个人的名字和他的钱数。模拟。
错误代码:
无
代码
#include<cstdio> #include<cstring> using namespace std; int n; struct node{ char name[20]; int sum; }student[20]; int main() { scanf("%d", &n); for(int i=1;i<=n;i++) scanf(" %s", student[i].name); for(int i=1;i<=n;i++) { char s[20]; int idx,mon,cnt,mon_aq,mon_af,idx1; scanf(" %s", s); for(int j=1;j<=n;j++) if(strcmp(s,student[j].name)==0) { idx=j; break; } scanf("%d%d", &mon, &cnt); if(cnt==0) continue; mon_aq=mon/cnt; mon_af=mon_aq*cnt; student[idx].sum-=mon_af; for(int j=1;j<=cnt;j++) { scanf(" %s", s); for(int k=1;k<=n;k++) if(strcmp(s,student[k].name)==0) { idx1=k; break; } student[idx1].sum+=mon_aq; } } for(int i=1;i<=n;i++) printf("%s %d\n", student[i].name,student[i].sum); }
黑色星期五friday the thirteenth(难度:普及-)
题目大意
从1900年到1900+n-1的时候每个月的13号是星期几。最后输出7个数,表示星期几
思路
直接通过每个月分的天数来统计即可。
错误代码:
无
代码
#include<cstdio> using namespace std; int n,last=3; int month[12]={31,31,28,31,30,31,30,31,31,30,31,30}; int ans[7]; int main() { scanf("%d", &n); for(int i=1900;i<=1899+n;i++) { if(i%400==0 || (i%100!=0 && i%4==0)) month[2]=29; for(int j=0;j<12;j++) { last=(last+month[j])%7; ans[last]++; } month[2]=28; } for(int i=0;i<7;i++) printf("%d ", ans[(i+6)%7]); return 0; }
坏掉的项链broken necklace(难度:普及-)
题目大意
从项链的两边开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事,问最多收多少珠子。
思路
把输入的字符串复制两边来模拟一个环形,然后枚举每个点。
错误代码:
代码
#include<cstdio> #include<iostream> #include<string> #include<algorithm> using namespace std; int n; string s; int calc(int idx) { int ans=0; char a1=s[idx]; char a2=s[idx+1]; for(int i=idx;;i--) { if(s[i]==a1 || s[i]=='w') ans++; else break; } for(int i=idx+1;;i++) { if(s[i]==a2 || s[i]=='w') ans++; else break; } return ans; } int main() { scanf("%d", &n); cin>>s; s=s+s+s; int ans=0; for(int i=n;i<2*n;i++) { if(s[i]==s[i+1]) continue; if(s[i]=='w') { s[i]='r'; ans=max(ans,calc(i)); s[i]='b'; ans=max(ans,calc(i)); s[i]='w'; } ans=max(ans,calc(i)); } ans=min(ans,n); if(ans==0) ans=n; printf("%d", ans); return 0; }