1031 Hello World for U (20 分)
不算难的图形输出
#include<bits/stdc++.h>
using namespace std;
int main() {
string s;
getline(cin , s);
int l = s.length(), n = (l + 2)/3, in = l-2*n, p = 0;
for(int i = 1; i <= n; i++) {
printf("%c", s[p]);
for(int j = 0; j < in; j++) {
if(i < n) printf(" " );
else printf("%c", s[p+j+1]);
}
printf("%c\n", s[l - p - 1]);
p++;
}
return 0;
}
1033 To Fill or Not to Fill (25 分)
一气胡写有24分,测试点6会出错,我试了个样例找到错了,但是改起来太痛苦了,先不改了,如果有二刷的话再改吧
24分
#include<bits/stdc++.h>
using namespace std;
int d[1005];
struct node{
int dis;
double price;
friend bool operator< (node a, node b){
if(a.dis == b.dis) return a.price < b.price;
else return a.dis < b.dis;
}
}sta[1005];
int main() {
int c, des, avg, n;
scanf("%d %d %d %d",&c, &des, &avg, &n);
for(int i = 0; i < n; i++) {
scanf("%lf %d", &sta[i].price, &sta[i].dis);
}
sta[n] = {des, 0};
sort(sta, sta+n+1);
int ldis = 0, vol = c * avg, pos = 0, nowd = 0;
double mp = 1 << 30, ans = 0;
bool f = 0;
for(int i = 0; i <= n; i++) {
if(ldis < sta[i].dis) {//到不了下一站,回头找找有没有能加油的地方
mp = 1 << 30;
int tp = -1;
for(int j = pos+1; j < i; j++) {
if(sta[j].price < mp) mp = sta[j].price, tp = j;
}
if(tp != -1) {
d[tp] = sta[tp].dis - sta[pos].dis;
sta[tp].dis = ldis;
ldis += d[tp];
pos = tp;
}
if(ldis < sta[i].dis) f = 1;//处理完还是到不了
}
if(f) {
ans = ldis;
printf("The maximum travel distance = %.2f\n", ans);
return 0;
}
if(sta[i].price < mp) {
d[i] = vol;
d[pos] = min(sta[i].dis - sta[pos].dis, vol);
mp = sta[i].price;
ldis = sta[i].dis + vol;
pos = i;
}
else d[i] = 0;
}
for(int i = 0; i < n; i++) {
ans += (double)sta[i].price / avg * d[i];
}
printf("%.2f\n", ans);
return 0;
}
/*
50 1300 12 8
16.00 1250
12.00 600
6.00 150
5.10 0
8.20 200
10.50 400
15.30 1000
9.85 300
*/
满分代码
别人的,作为参考
#include <cstdio>
#include <algorithm>
using namespace std;
struct Sta{
double price, distance;
}sta[510];
bool cmp(Sta a, Sta b){
return a.distance<b.distance;
}
int main(){
double cmax,d,davg;
int n;
scanf("%lf%lf%lf%d",&cmax, &d, &davg,&n);
for (int i=0; i<n; i++){
scanf("%lf %lf",&sta[i].price, &sta[i].distance);
}
sta[n].price=0;
sta[n].distance=d;
sort(sta,sta+n+1,cmp);
if (sta[0].distance){
printf("The maximum travel distance = 0.00");//出不了杭州 直接return
return 0;
}else {
double maxDis=davg*cmax;//加满油能跑的最大距离
int now=0;//现在在第0号加油站
double distance=0, payment=0, nowTank=0;
int flag=1;
while(now<n){//没到终点
distance=sta[now].distance+maxDis;//此时加满油能到的最远的地方
if (distance<sta[now+1].distance) {
printf("The maximum travel distance = %.2f",distance);//加满油都跑不到下一站 直接return
return 0;
}else {//我能跑到其他加油站
flag=1;
for (int i=now+1; sta[i].distance<=distance && i<=n; i++){
if (sta[i].price<sta[now].price){//从下一站开始 直到我能跑到的最大距离 只要有加油站价格比我低 我就跑到那个加油站
double dis=sta[i].distance-sta[now].distance;
double needGas=dis/davg;
if (nowTank>=needGas){
nowTank-=needGas;//我不用加油 直接跑到那个加油站
}else {
payment+=(needGas-nowTank)*sta[now].price;//我需要加油才能跑到下一个比我还便宜的加油站
nowTank=0;//我加的油此刻 正好能让我跑到下一比现在便宜的加油站 跑到下一个加油站时 油箱就空了
}
now=i;//我现在跑到了 下一个便宜的加油站了
flag=0;//有加油站比我最开始的加油站便宜
break;
}
}
if (flag){//在我能跑到的范围内 所有加油站都比现在的贵
int min=now+1;
for (int i=now+2; sta[i].distance<=distance && i<=n; i++){
if (sta[min].price>sta[i].price) {
min=i;
}
}//那就找出 其余加油站中 最便宜的那个加油站吧
//在现在的这个加油站 一次性加满油 跑到下一个加油站
double dis=sta[min].distance-sta[now].distance;
double needGas=dis/davg;
payment+=(cmax-nowTank)*sta[now].price;
nowTank=cmax-needGas;//跑到下一加油站的时候 油箱油就要损失needGas了
now=min;
}
}
}
printf("%.2f",payment);
}
}
1034 Head of a Gang (30 分)
友友们,用并查集写的话初始化的时候不要小气,只初始化到n是不行的,测试点3会错,浪费半小时找错
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
unordered_map<string, int> mp;
unordered_map<int, int> mp1;
int fa[N], cnt, w[N];
vector<pair<string, int> >ans;
string name[N];
struct node{
int pnum, totw, maxw, head;
}gang[N];
int get(int x) {
if(x == fa[x]) return x;
return fa[x] = get(fa[x]);
}
void merge(int x, int y) {
int fx = get(x), fy = get(y);
if(fx != fy) {
fa[fx] = fy;
}
}
int main() {
int n, th, len, x, y;
string a, b;
a.resize(3);
b.resize(3);
scanf("%d %d", &n, &th);
for(int i = 1; i <= 3*n; i++) fa[i] = i;
for(int i = 0; i < n; i++) {
scanf("%s %s %d",&a[0], &b[0], &len);
if(mp.count(a) == 0) mp[a] = ++cnt, name[cnt] = a, x = cnt;
else x = mp[a];
if(mp.count(b) == 0) mp[b] = ++cnt, name[cnt] = b, y = cnt;
else y = mp[b];
merge(x, y);
w[x] += len, w[y] += len;
}
int m = 0, p;
for(int i = 1; i <= cnt; i++) {
int fi = get(i);
if(mp1.count(fi) == 0) mp1[fi] = ++m, p = m;
else p = mp1[fi];
gang[p].pnum++;
gang[p].totw += w[i];
if(w[i] > gang[p].maxw) {
gang[p].maxw = w[i];
gang[p].head = i;
}
}
for(int i = 1; i <= m; i++) {
if(gang[i].pnum > 2 && gang[i].totw > th * 2) {
ans.push_back(make_pair(name[gang[i].head], gang[i].pnum));
}
}
printf("%d\n",ans.size());
sort(ans.begin(), ans.end());
for(int i = 0; i < ans.size(); i++) {
printf("%s %d\n",ans[i].first.c_str(), ans[i].second);
}
return 0;
}
1035 Password (20 分)
这辈子没这么无语过的一道题,我一直错一个点,看了半天才发现还有单复数,真的你搁这搁这呢
#include<bits/stdc++.h>
using namespace std;
vector<int> ans;
string id[1005], pwd[1005];
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i++) {
bool f = 0;
cin >> id[i] >> pwd[i];
int l = pwd[i].length();
for(int j = 0; j < l; j++) {
if(pwd[i][j] == '1') pwd[i][j] = '@', f = 1;
else if(pwd[i][j] == '0') pwd[i][j] = '%', f = 1;
else if(pwd[i][j] == 'l') pwd[i][j] = 'L', f = 1;
else if(pwd[i][j] == 'O') pwd[i][j] = 'o', f = 1;
}
if(f) ans.push_back(i);
}
if(ans.size()) {
cout<<ans.size()<<endl;
for(int i = 0; i < ans.size(); i++) {
int ind = ans[i];
cout<<id[ind]<<" "<<pwd[ind]<<endl;
}
}
else {
if(n == 1) {
printf("There is 1 account and no account is modified\n");
}
else{
printf("There are %d accounts and no account is modified\n",n);
}
}
return 0;
}
1037 Magic Coupon (25 分)
正负数分开处理,0去除掉不处理,负数从最小值往大乘,正数从最大值往小乘
还有scanf真的很严格,写的是读%lld一定要定义成longlong否则就会出现很多奇怪的错误
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
#define ll long long
vector<ll> c1, c2, p1, p2;
int main() {
int n, m, pos, i, j;
ll a;
scanf("%d",&n);
for(int i = 0; i < n; i++) {
scanf("%lld",&a);
if(a < 0) c1.push_back(a);
else if(a > 0) c2.push_back(a);
}
scanf("%d",&m);
for(int i = 0; i < m; i++) {
scanf("%lld",&a);
if(a < 0) p1.push_back(a);
else if(a > 0) p2.push_back(a);
}
sort(c1.begin(), c1.end());
sort(c2.begin(), c2.end());
sort(p1.begin(), p1.end());
sort(p2.begin(), p2.end());
ll ans = 0;
for(i = 0, j = 0; i < c1.size() && j < p1.size(); i++, j++) {
ans += c1[i] * p1[j];
}
for(i = c2.size()-1, j = p2.size()-1; i >= 0 && j >= 0; i--, j--) {
ans += c2[i] * p2[j];
}
cout<<ans<<endl;
return 0;
}
1038 Recover the Smallest Number (30 分)
自己写一个排序对每个不同数字开始的字符串进行排序即可,然后测试点2是只输入一个0的情况
#include<bits/stdc++.h>
using namespace std;
vector<string> number[105];
void change(string &a) {
int l = a.length(), i;
for(i = 0; i < l; i++) {
if(a[i] != '0') break;
}
a = a.substr(i, l);
}
bool cmp(string a, string b) {
char ch = a[0], ca, cb;
int la = a.length(), lb = b.length();
for(int i = 0, j = 0; i < la || j < lb; i++, j++) {
if(i >= la) ca = ch;
else ca = a[i];
if(j >= lb) cb = ch;
else cb = b[j];
if(ca < cb) return true;
else if(ca > cb) return false;
}
return true;
}
int main() {
int n;
scanf("%d",&n);
string s;
for(int i = 0; i < n; i++) {
cin >> s;
int ind = s[0] - '0';
number[ind].push_back(s);
}
int cnt = 0;
for(int i = 0; i <= 9; i++) {
sort(number[i].begin(), number[i].end(), cmp);
for(int j = 0; j < number[i].size(); j++) {
if(!cnt++) change(number[i][j]);
if(number[i][j].empty()) cnt--;
cout<<number[i][j];
}
}
if(!cnt)printf("0");
return 0;
}
1039 Course List for Student (25 分)
map处理,依然是<string, set < int > >这样的形式 ,其他就没啥了
#include<bits/stdc++.h>
using namespace std;
map<string, set<int> > mp;
int main() {
int n, k;
cin >> n >> k;
for(int i = 0; i < k; i++) {
int a, b;
string c;
cin >> a >> b;
for(int j = 0; j < b; j++) {
cin >> c;
mp[c].insert(a);
}
}
for(int i = 0; i < n; i++) {
string a;
cin >> a;
cout<<a<<" "<<mp[a].size();
for(auto it : mp[a]) {
cout<<" "<<it;
}
cout<<"\n";
}
return 0;
}
1040 Longest Symmetric String (25 分)
把原串翻转以后可以用最简单的类似模式串匹配的方法求解,用一步小小的优化就能满分,否则就会超时
#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005];
int main() {
string s, t;
getline(cin, s);
t = s;
int ans = -1, ls = s.length(), lt = t.length();
reverse(t.begin(), t.end());
for(int i = 0; i < ls; i++) {
if(ls - i <= ans) break;//就是这里一定要有,否则就超时
for(int j = 0; j < lt; j++) {
int ti = i, tj = j;
while(ti < ls && tj < lt && s[ti] == t[tj]) ti++, tj++;
ans = max(ans, tj - j);
}
}
cout<<ans<<endl;
return 0;
}